使用 Graph SDK 获取 OneDrive 自定义年限 Client secret 的 API
前言
想必大伙都撸到 E3 了吧,将 5T 的 OneDrive 挂载到 vps 上或本地可能是一部人的使用需求,但在 Azure 中申请的 Client secret 最多就两年的期限,而 Graph SDK 创建的可以自定义期限。
教程
以下所有命令均在在 PowerShell 执行。
安装 Graph SDK
1
Install-Module Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
登录账号
登录账号并获取服务,此处会弹窗登录,第一次建议用管理员账号登录给授权,不然子账号没法登录使用程序:
1
2
3
Connect-MgGraph -Scopes "Application.ReadWrite.All", "AppRoleAssignment.ReadWrite.All", "Directory.ReadWrite.All"
$graphSp = Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Graph'"
配置服务
1
2
3
4
5
6
7
8
9
10
$displayName = "rclone" # 注册应用服务名称,可自定义
$secretDisplayName = "rclone-secret" # 密钥名称,可自定义
$secretValidityYears = 100 # 期限,这里设置 100 年,可自定义
$redirectUri = "http://localhost" # 重定向 URI,具体看使用的程序的说明,如果是 rclone 就不用修改
$signInAudience = "AzureADandPersonalMicrosoftAccount" # 受支持的帐户类型,如果你不知道用来做什么,就不用修改
# === 权限定义 ===
# 基本的读写权限,如有其他需求可自行修改
$delegatedPermissions = @("User.Read", "Files.Read", "Files.ReadWrite", "offline_access")
$appPermissions = @("Files.Read.All", "Files.ReadWrite.All")
创建应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# === 查找权限 ID ===
$requiredDelegatedScopes = $graphSp.Oauth2PermissionScopes | Where-Object { $delegatedPermissions -contains $_.Value }
$requiredAppRoles = $graphSp.AppRoles | Where-Object { $appPermissions -contains $_.Value }
# === 构建权限结构 ===
$resourceAccessList = @()
$requiredDelegatedScopes | ForEach-Object {
$resourceAccessList += @{
Id = $_.Id
Type = "Scope"
}
}
$requiredAppRoles | ForEach-Object {
$resourceAccessList += @{
Id = $_.Id
Type = "Role"
}
}
$requiredResourceAccess = @(
@{
ResourceAppId = $graphSp.AppId
ResourceAccess = $resourceAccessList
}
)
# === 设置重定向 URI ===
$webRedirectUris = @($redirectUri)
# === 创建应用程序 ===
$app = New-MgApplication -DisplayName $displayName `
-SignInAudience $signInAudience `
-Web @{ RedirectUris = $webRedirectUris } `
-RequiredResourceAccess $requiredResourceAccess
# === 创建服务主体 ===
$sp = New-MgServicePrincipal -AppId $app.AppId
# === 创建客户端密码凭据 ===
$startDate = Get-Date
$endDate = $startDate.AddYears($secretValidityYears)
$secret = Add-MgApplicationPassword -ApplicationId $app.Id -PasswordCredential @{
DisplayName = $secretDisplayName
StartDateTime = $startDate
EndDateTime = $endDate
}
# === 输出信息 ===
Write-Host "应用名称: $displayName"
Write-Host "Application (client) ID: $($app.AppId)"
Write-Host "Client Secret: $($secret.SecretText)"
至此,不出意外就成功获取到 Client ID 和 Client secret 了。如想获取下一个账号的,则用 Disconnect-MgGraph 命令注销登录再重复上面步骤即可。
本文由作者按照
CC BY 4.0
进行授权

