如何在C#中实现Grant-AzDiskAccess获取磁盘SAS URL?
方式一:使用Azure Resource Manager SDK(推荐)
- 依赖的NuGet包:
Azure.ResourceManager.Compute(这是Azure最新的ARM SDK,替代旧版的Microsoft.Azure.Management.Compute) - 核心类与方法:
ArmClient:初始化Azure客户端,处理身份验证逻辑DiskResource:代表单个磁盘资源,其GrantAccessAsync方法对应PowerShell的Grant-AzDiskAccess命令DiskAccessGrantContent:用于指定访问权限(Read/Write)和SAS链接的过期时长
示例代码:
using Azure.ResourceManager; using Azure.ResourceManager.Compute; using Azure.ResourceManager.Compute.Models; using System; using System.Threading.Tasks; public async Task<string> GetDiskSasUrl(string subscriptionId, string resourceGroupName, string diskName) { // 使用DefaultAzureCredential处理身份验证(支持服务主体、托管标识等多种方式) var armClient = new ArmClient(new DefaultAzureCredential()); // 构造磁盘资源的唯一标识符 var diskId = new ResourceIdentifier($"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}"); var diskResource = armClient.GetDiskResource(diskId); // 配置访问参数:只读权限,1小时后过期 var grantParams = new DiskAccessGrantContent(DiskAccessLevel.Read, TimeSpan.FromHours(1).TotalSeconds); // 发起请求获取SAS链接 var accessResponse = await diskResource.GrantAccessAsync(WaitUntil.Completed, grantParams); return accessResponse.Value.AccessSas; }
方式二:直接调用Azure REST API
如果不想依赖SDK,可直接调用Azure Compute服务的REST API:
- API请求方式:
POST - 请求端点:
https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/disks/{diskName}/beginGetAccess?api-version=2023-04-02 - 请求体示例:
{ "access": "Read", // 可选值:Read/Write "durationInSeconds": 3600 // SAS过期时长,单位为秒,最大不超过86400(24小时) }
- 身份验证:请求头中需携带
Authorization: Bearer {accessToken},令牌需拥有目标磁盘的Microsoft.Compute/disks/beginGetAccess/action权限
注意事项
- 跨租户迁移场景下,确保身份验证主体(如服务主体)在源、目标租户的对应订阅/资源组中均拥有足够权限
- SAS链接的过期时长不能超过24小时,需根据迁移需求合理设置
内容的提问来源于stack exchange,提问作者CloudAnywhere
相关产品推荐
相关产品推荐

