Invoke-ProcessTable执行报错:传入的Application ID无效
Invoke-ProcessTable 执行报Application ID格式无效排查
异常脚本片段
# create pscredential object $credObject = New-Object -TypeName System.Management.Automation.PSCredential ` -ArgumentList $ServicePrincipal, $secStringPassword #Get App Id for Service Principle $SPDetails = Get-AzADServicePrincipal -DisplayName $ServicePrincipal $SP_AppId = ($SPDetails).AppId Invoke-ProcessTable ` -TableName $TableName ` -DatabaseName $DatabaseName ` -RefreshType Full ` -Server $Server ` -ServicePrincipal ` -Credential $credObject ` -TenantId $TenantId ` -ApplicationId $SP_AppId
脚本中$TenantId为硬编码配置值。
报错信息
Invoke-ProcessTable : The provided application id 'app:"service principle name"@6"tenant id"5' is invalid. Parameter name: id At C:\temp\powerrshell\invoke-processtable.ps1:25 char:1
- Invoke-ProcessTable `
+ CategoryInfo : NotSpecified: (:) [Invoke-ProcessTable], ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.AnalysisServices.PowerShell.Cmdlets.ProcessTable
报错中返回的Application ID不符合GUID格式,混入了服务主体名称、租户ID片段。
根因
Get-AzADServicePrincipal -DisplayName $ServicePrincipal存在两类异常返回场景:- 租户内存在多个同名服务主体,命令返回对象数组而非单个服务主体对象,此时取
.AppId得到的是属性集合,不是单个GUID字符串 - 没有匹配到对应名称的服务主体,
$SP_AppId值为$null
- 租户内存在多个同名服务主体,命令返回对象数组而非单个服务主体对象,此时取
- 以上两种场景都会导致传给
-ApplicationId的参数值不符合要求:传入集合或空值时,cmdlet会触发隐式取值逻辑,从-Credential对象中提取用户名(也就是你存的服务主体显示名),和租户ID拼接成错误的ID字符串,和报错内容完全匹配。
修复方案
- 优化服务主体查询逻辑,确保拿到唯一合法的AppId(GUID格式):
# 优先取第一个匹配结果,避免返回数组 $SPDetails = Get-AzADServicePrincipal -DisplayName $ServicePrincipal | Select-Object -First 1 $SP_AppId = $SPDetails.AppId # 最稳妥方案:直接传入服务主体的Application ID(GUID格式),完全绕开重名、查无对象的问题 # $SP_AppId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
- 传参前增加格式校验,提前拦截非法值:
if (-not [Guid]::TryParse($SP_AppId, [ref][Guid]::Empty)) { throw "获取到的Application ID格式非法,当前值:$SP_AppId,请检查服务主体查询逻辑" }
- 注意:创建
$credObject时,第一个参数(用户名位)也建议传入服务主体的Application ID而非显示名,避免其他隐式取值逻辑触发同类错误。
内容的提问来源于stack exchange,提问作者Geezer
相关产品推荐
相关产品推荐

