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

应用权限模式下如何指定OneDrive for Business的目标用户?

问题解答

1. 如何指定具体用户的OneDrive?

使用应用权限时,直接在Graph API请求路径中指定目标用户的用户主体名称(UPN,格式如user@yourdomain.com)或用户ID即可。比如你的上传URL需要修改为:

https://graph.microsoft.com/v1.0/users/目标用户UPN或ID/drive/root:/DropFileIn/{文件名}:/content

例如目标用户UPN是john@contoso.com,则URL为:

https://graph.microsoft.com/v1.0/users/john@contoso.com/drive/root:/DropFileIn/test.txt:/content

2. 是否需要对该用户进行认证?

不需要。应用权限是授予给应用本身的权限,允许应用直接访问租户内所有符合权限范围的用户资源(前提是权限已由管理员审批通过)。你需要切换到**客户端凭证流(Client Credentials Flow)**获取应用级别的访问令牌,而非之前的用户名密码流(该流属于委托权限场景,且会触发2FA导致失败)。

修改后的代码示例

import os
import requests
import msal

# 配置信息
CLIENT_ID = '你的应用ID'
TENANT_ID = '你的租户ID'
CLIENT_SECRET = '你的应用客户端密钥'  # 应用注册时生成,应用权限必须使用
AUTHORITY_URL = f'https://login.microsoftonline.com/{TENANT_ID}'
# 应用权限的scope固定为 https://graph.microsoft.com/.default
SCOPES = ['https://graph.microsoft.com/.default']

# 初始化机密客户端应用(应用权限场景需用此类)
app = msal.ConfidentialClientApplication(
    CLIENT_ID,
    authority=AUTHORITY_URL,
    client_credential=CLIENT_SECRET
)

# 获取应用级访问令牌
token_result = app.acquire_token_for_client(scopes=SCOPES)
if 'access_token' not in token_result:
    print(f"令牌获取失败: {token_result.get('error_description')}")
    exit()

headers = {'Authorization': f"Bearer {token_result['access_token']}"}

# 目标用户的UPN或用户ID
target_user = 'john@contoso.com'
# OneDrive中的目标文件夹路径
target_folder = '/DropFileIn'

# 遍历本地文件夹上传文件
for root, dirs, files in os.walk('C:/Users/Lenovo/Documents/securepass'):
    for file_name in files:
        file_path = os.path.join(root, file_name)
        file_size = os.stat(file_path).st_size
        # 读取文件内容(使用with语句自动关闭文件)
        with open(file_path, 'rb') as file_data:
            if file_size < 4100000:
                # 构造上传URL
                upload_url = f"https://graph.microsoft.com/v1.0/users/{target_user}/drive/root:{target_folder}/{file_name}:/content"
                # 发送上传请求
                response = requests.put(upload_url, data=file_data, headers=headers)
                # 检查请求是否成功
                if response.status_code == 201:
                    print(f"文件 {file_name} 上传成功")
                else:
                    print(f"文件 {file_name} 上传失败: {response.text}")

关键注意事项

  • 应用权限需要全局管理员在Azure AD管理中心为你的应用授予(例如Files.ReadWrite.All应用权限),授予后应用可访问租户内所有用户的OneDrive。
  • 不要使用PublicClientApplication处理应用权限场景,应改用ConfidentialClientApplication,并提供客户端密钥(或证书)。
  • 原代码中的allowPublicClient设置适用于公共客户端应用(如桌面APP),但应用权限场景下,应用本质上是机密客户端,该设置可保留但不影响客户端凭证流的使用。

内容的提问来源于stack exchange,提问作者Abhishek Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:45:34