You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python导出Azure日志并获取Azure Portal所有用户会话

可用于Azure Portal相关操作的Python库
  • azure-mgmt-monitor:Azure官方监控管理库,用于拉取活动日志、用户操作日志等平台侧日志数据
  • azure-identity:Azure官方身份验证库,支持服务主体、托管身份等多种认证方式,用于完成Azure API访问的身份鉴权
  • azure-mgmt-resourcegraph:适用于跨订阅、跨资源的批量数据查询,可提升日志拉取效率
  • msgraph-sdk-python:Microsoft Graph官方Python SDK,用于拉取Azure AD侧的用户登录、会话相关数据
需求实现步骤

1. 前置准备

首先在Azure AD中注册应用,为应用分配以下权限并完成管理员同意:

  • Azure Monitor的Monitor Reader权限
  • Azure AD的AuditLog.Read.All、Directory.Read.All权限
    获取应用对应的客户端ID、租户ID、客户端密钥,以及目标订阅ID用于后续接口调用。

2. 初始化认证与客户端

示例代码如下:

from azure.identity import ClientSecretCredential
from azure.mgmt.monitor import MonitorManagementClient
from msgraph import GraphServiceClient
import datetime
import csv

# 替换为实际参数
TENANT_ID = "你的Azure租户ID"
CLIENT_ID = "注册应用的客户端ID"
CLIENT_SECRET = "注册应用的客户端密钥"
SUBSCRIPTION_ID = "目标Azure订阅ID"

# 初始化认证凭证
credential = ClientSecretCredential(
    tenant_id=TENANT_ID,
    client_id=CLIENT_ID,
    client_secret=CLIENT_SECRET
)

# 初始化Azure Monitor客户端
monitor_client = MonitorManagementClient(credential, SUBSCRIPTION_ID)

# 初始化Microsoft Graph客户端
graph_scopes = ["https://graph.microsoft.com/.default"]
graph_client = GraphServiceClient(credentials=credential, scopes=graph_scopes)

3. 导出Azure平台全部用户日志

用户在Azure平台的所有操作记录存储在Monitor活动日志中,拉取导出示例:

# 定义拉取时间范围,示例为过去30天
end_time = datetime.datetime.utcnow()
start_time = end_time - datetime.timedelta(days=30)
filter_str = f"eventTimestamp ge '{start_time.isoformat()}' and eventTimestamp le '{end_time.isoformat()}'"

# 拉取活动日志
activity_logs = monitor_client.activity_logs.list(
    filter=filter_str,
    select="eventTimestamp,caller,operationName,resourceGroupName,status"
)

# 导出到CSV文件
with open('azure_user_operation_logs.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['时间戳(UTC)', '操作用户', '操作名称', '所属资源组', '操作状态'])
    for log in activity_logs:
        if log.caller: # 过滤系统级操作,仅保留用户触发的操作
            writer.writerow([
                log.event_timestamp,
                log.caller,
                log.operation_name.localized_value,
                log.resource_group_name,
                log.status.localized_value
            ])

4. 获取Azure Portal用户会话及会话时长

Azure Portal的用户登录、会话数据存储在Azure AD登录日志中,通过Microsoft Graph接口拉取,示例:

# 拉取登录日志
sign_in_records = graph_client.audit_logs.sign_ins.get().await_result()

# 过滤Azure Portal会话、计算会话时长并导出
with open('azure_portal_user_sessions.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['用户UPN', '登录时间(UTC)', '最后活动时间(UTC)', '会话时长(分钟)', '登录IP', '登录状态'])
    for record in sign_in_records.value:
        # 过滤仅Azure Portal的登录会话
        if record.app_display_name != "Azure Portal":
            continue
        login_time = record.created_date_time
        last_active = record.last_non_interactive_sign_in_date_time if record.last_non_interactive_sign_in_date_time else login_time
        session_duration = round((last_active - login_time).total_seconds()/60, 2)
        status = "成功" if record.status.error_code is None else f"失败,错误码:{record.status.error_code}"
        writer.writerow([
            record.user_principal_name,
            login_time,
            last_active,
            session_duration,
            record.ip_address,
            status
        ])

注意:默认Azure AD登录日志仅保留30天,若需要拉取更久的历史会话数据,需提前配置Azure AD日志导出到Log Analytics工作区或存储账号,再通过对应API查询历史数据;所有接口调用的权限需配置为应用权限,而非委托权限,否则无法拉取全租户的日志数据。

内容的提问来源于stack exchange,提问作者Hassan Turi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:45:03