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

使用PowerShell创建Azure SPN密钥时如何捕获密钥值?

在Azure应用注册中创建SPN密钥时捕获密钥值的解决方案

问题背景

我在Azure应用注册中为SPN创建新密钥时,遇到了无法捕获密钥明文值的问题。使用Update-AzADServicePrincipal的代码能成功创建密钥,但返回的变量为空;之前误以为New-AzADAppCredential是用来创建新SPN的,后来确认它才是正确的解决方案。

原代码问题

以下是我最初使用的代码:

$Pass = New-Guid | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object Microsoft.Azure.PowerShell.Cmdlets.Resources.MSGraph.Models.ApiV10.MicrosoftGraphPasswordCredential
$Credential.KeyId = [guid]::NewGuid()
$Credential.EndDateTime = $(Get-Date).AddMonths(6)
$Credential.DisplayName = "Created by script"
$secret=Update-AzADServicePrincipal -ObjectId  "myAPPid" -PasswordCredential $Credential

这段代码确实能成功为SPN创建新密钥,但Update-AzADServicePrincipal命令不会返回密钥的明文值,因此$secret变量为空。由于Azure不会存储密钥明文,创建完成后无法再检索该值,必须在创建时直接捕获。

正确解决方案:使用New-AzADAppCredential

New-AzADAppCredential专门用于为Azure应用注册(及其关联的SPN)创建密码凭据,并且会返回包含密钥明文的结果,这是唯一能获取密钥明文的时机。示例代码如下:

# 为指定应用注册创建密码凭据,有效期6个月
$credentialResult = New-AzADAppCredential -ApplicationId "你的应用客户端ID" -DisplayName "Created by script" -EndDate (Get-Date).AddMonths(6)

# 提取明文密钥(仅创建时可获取,之后无法再查询)
$plainTextSecret = $credentialResult.SecretText

# 建议将密钥存储到安全位置,比如Azure Key Vault,避免明文泄露
Write-Host "生成的密钥:$plainTextSecret"

关键说明

  • 参数ApplicationId需填写应用注册的客户端ID,而非SPN的ObjectId
  • SecretText属性是唯一能获取密钥明文的途径,创建完成后Azure不会保留该值
  • 务必妥善保存密钥,避免泄露或丢失

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:13