我正在通过 python 对 azure 进行身份验证以列出我所有的虚拟机,但我收到了这个错误

Posted

技术标签:

【中文标题】我正在通过 python 对 azure 进行身份验证以列出我所有的虚拟机,但我收到了这个错误【英文标题】:I am authenticating to azure through python to list down all my virtual machines and I am getting this error 【发布时间】:2022-01-18 19:32:23 【问题描述】:

当我尝试通过 python 列出我在 Azure 上的所有虚拟机时遇到此错误

Code: AuthorizationFailed
Message: The client "XXXX" with object id "XXXX" does not have authorization to perform action 'Microsoft.Compute/virtualMachines/read' over scope '/subscriptions/XXXXX or the scope is invalid. If access was recently granted, please refresh your credentials.

我的代码如下:

from azure.mgmt.compute import ComputeManagementClient
from azure.identity import ClientSecretCredential


Subscription_Id = "XXXX"
Tenant_Id = "XXXXX"
Client_Id = "XXXXX"
Secret = "XXXXX"

credential = ClientSecretCredential(
    client_id=Client_Id,
    client_secret=Secret,
    tenant_id=Tenant_Id
)

compute_client = ComputeManagementClient(credential, Subscription_Id)
vm_list = compute_client.virtual_machines.list_all()
pageobject1 = vm_list.by_page(continuation_token=None)
for page in pageobject1:
    for j in page:
        print(j)

【问题讨论】:

根据错误消息,您的服务主体似乎没有所需的权限。尝试将 Virtual Machine Contributor 权限分配给您的 SP。运行 python 脚本并检查您是否能够列出虚拟机 @VenkateshDodda-MT 此脚本列出了虚拟机,但出现此错误。同样,当我验证服务主体并将角色分配给我的客户端 ID 时,搜索中也不会显示 imgur.com/a/n6kb9e0 【参考方案1】:

当您尝试将virtualmachinecontributor 等特定角色分配给您的服务主体时,您需要传递service principal/appregistration name 而不是传递您的应用注册applicationId/objectId ,如下所示。

提供对service principal/appregistration 的所需访问权限后,您将能够提取订阅中的虚拟机列表。我们已经在本地环境中检查了上面的 python,它也可以正常工作。

这里是示例输出截图供参考:


更新了使用资源管理客户端提取 VM 列表的答案:

from azure.mgmt.resource import ResourceManagementClient
from azure.identity import ClientSecretCredential


Subscription_Id = "<subId>"
Tenant_Id = "<tenantid>"
Client_Id = "<appId>"
Secret = "<clientSecret>"

credential = ClientSecretCredential(
    client_id=Client_Id,
    client_secret=Secret,
    tenant_id=Tenant_Id
)

resource_client=ResourceManagementClient(credential=credential,subscription_id=Subscription_Id)
resource_list=resource_client.resources.list()
for item in resource_list:
    if(item.type == 'Microsoft.Compute/virtualMachines'):
        print(item)

【讨论】:

我收到这个错误我的图书馆是最新的但仍然出现错误请指导我pageobject1 = vm_list.by_page(continuation_token=None) AttributeError: 'VirtualMachinePaged' object has no attribute 'by_page' 你能看看我更新的答案并尝试使用资源管理客户端来拉取虚拟机列表,而不是使用计算管理客户端 错误改了self._creds.signed_session(session) AttributeError: 'ClientSecretCredential' object has no attribute 'signed_session' 你试过我在上面分享的新python使用资源管理客户端吗? 是的先生,我已经导入了那个库

以上是关于我正在通过 python 对 azure 进行身份验证以列出我所有的虚拟机,但我收到了这个错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure AD 通过 OAuth2 对 Azure API 管理进行身份验证

在 Azure Batch 中使用托管标识在批处理池中使用 Python 对 Key Vault 进行身份验证

通过 restful api 进行 Azure AD 身份验证

如何使用 Azure AD 对 VueJS 应用程序进行身份验证?

如何使用 OAuth 2.0 通过 Azure Active Directory 对用户进行身份验证?

如何集成Apache NiFi和Azure Active Directory以进行用户身份验证?