You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过PowerShell使用Azure AD注册应用以系统账户身份启动进程?

问题分析与解决方案

首先得明确一个核心点:Azure AD服务主体并不是Windows本地/域账户,它是Azure生态系统专属的身份标识,依赖Azure AD的认证体系;而Start-Process这类Windows进程启动命令,本质调用的是Windows本地安全机制,需要的是存在于本地SAM数据库或Active Directory中的用户身份(带有Windows安全标识符SID)。这就是为什么你能用服务主体成功连接Azure,但无法用它启动本地进程的原因——Windows根本不认识这个身份。

为什么你的现有代码失败?

  • Connect-AzureRmAccount(现在建议用Connect-AzAccount)能成功,是因为Azure PowerShell模块专门实现了服务主体的认证逻辑,直接和Azure AD交互验证身份;
  • Start-ProcessSystem.Diagnostics.Process调用的是Windows原生进程启动API,这些API只接受Windows兼容的用户身份,服务主体的应用ID和密钥对它们来说完全无效,所以会抛出“用户名或密码错误”或“存根收到错误数据”的异常。

可行的解决方案

根据你的需求(用具备Azure AD管理权限的非脚本运行者身份启动进程),有两种主流方案:

方案1:使用具备Azure权限的Windows/AAD用户身份启动进程

如果你的设备是Azure AD JoinedHybrid Azure AD Joined,可以创建一个Azure AD用户(而非服务主体),给它分配Azure管理角色,然后用这个用户的凭据启动进程。这个用户是Windows认可的身份,可以直接用于进程启动。

示例代码:

# 替换为你的Azure AD用户(必须是可登录Windows的AAD用户,不是服务主体)
$aadUser = "your-aad-user@your-tenant.onmicrosoft.com"
$aadPassword = ConvertTo-SecureString "your-aad-user-password" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PsCredential($aadUser, $aadPassword)

# 启动进程
Start-Process -FilePath notepad -Credential $credential

配置步骤:

  1. 在Azure AD中创建一个用户(或使用已有的同步到AAD的域账户);
  2. 给该用户分配所需的Azure管理角色(比如Contributor、Owner等);
  3. 如果是Azure AD Joined设备,确保该用户有权限登录此设备;如果是本地设备,可能需要将AAD用户添加到本地用户组(比如管理员组)。

方案2:分离进程启动身份与Azure操作身份

如果必须保留服务主体的权限(比如服务主体有更精细的权限控制,或者不需要创建额外的AAD用户),可以分开处理:

  • 用一个合法的Windows身份(本地账户、域账户或AAD用户)启动本地进程;
  • 在进程内部,使用服务主体的凭据执行Azure相关操作。

示例代码:

# 用当前用户或指定Windows身份启动记事本
Start-Process notepad

# 在记事本进程中(或关联的脚本里),用服务主体认证并执行Azure操作
$applicationId = "My ApplicationID"
$servicePrincipalSecret = "My Application's secret Key"
$securePassword = ConvertTo-SecureString $servicePrincipalSecret –AsPlainText -Force
$credential = New-Object System.Management.Automation.PsCredential($applicationId, $securePassword)

# 连接Azure(建议使用Az模块而非AzureRm)
Connect-AzAccount -Credential $credential -Tenant "My Azure tenant ID" -ServicePrincipal

# 示例:列出Azure资源组
Get-AzResourceGroup

这个方案的优势是不需要额外创建具备Windows登录权限的AAD用户,同时能利用服务主体的权限完成Azure管理操作。

额外说明

  • 永远不要把服务主体的密钥硬编码在脚本中,建议使用Azure Key Vault来存储密钥,然后在脚本中安全获取;
  • 如果你的设备是工作区加入(Workplace Joined),AAD用户可能无法直接用于本地进程启动,这种情况下建议使用方案2;
  • 若要以系统账户(NT AUTHORITY\SYSTEM)启动进程,不需要AAD身份,可借助psexec -s这类工具直接调用,或者通过任务计划程序配置以系统身份运行脚本。

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

火山引擎 最新活动