如何通过Azure Function托管身份无人值守运行PowerShell组清理脚本?
实现Azure Function托管身份无人值守运行PowerShell脚本的步骤
1. 配置Azure Function系统分配托管身份
- 在Azure门户找到目标Azure Function,进入「身份」选项卡,开启「系统分配」身份,保存后记录该身份的对象ID(后续授权环节需用到)。
2. 为托管身份分配必要权限
针对Microsoft Graph(处理Office 365用户与组)
- 进入Azure AD「应用注册」→「企业应用」,搜索你的Azure Function托管身份名称。
- 进入「权限」选项卡,点击「添加权限」,选择「Microsoft Graph」→「应用权限」:
- 添加
GroupMember.ReadWrite.All(用于读取/移除组成员) - 添加
Group.Read.All(用于读取用户所属组) - 添加
User.Read.All(用于读取用户基础信息)
- 添加
- 点击「授予管理员同意」,完成权限生效。
针对SharePoint Online(读取列表数据)
- 以SharePoint管理员身份访问目标站点,将托管身份添加为「站点所有者」或「站点参与者」;也可通过PowerShell分配站点权限:
Connect-PnPOnline -Url "https://你的租户名.sharepoint.com/sites/目标站点" -Interactive Add-PnPAppPrincipalPermission -AppPrincipalId "<托管身份对象ID>" -Site "https://你的租户名.sharepoint.com/sites/目标站点" -Permissions Read -Scope Site
3. 调整PowerShell脚本适配托管身份
替换原有登录逻辑
将原脚本中需要手动登录的Connect-MsolService/Connect-AzureAD替换为托管身份认证:
# 用托管身份连接Microsoft Graph Connect-MgGraph -Identity
适配SharePoint列表读取逻辑
使用PnP PowerShell通过托管身份连接并读取列表:
# 用托管身份连接SharePoint站点 Connect-PnPOnline -Url $env:SHAREPOINT_SITE_URL -ManagedIdentity # 读取列表中的目标用户邮箱 $targetUsers = Get-PnPListItem -List $env:TARGET_LIST_NAME | Select-Object -ExpandProperty FieldValues | Select-Object -Property Email
保留核心业务逻辑(读取组并移除用户)
foreach ($user in $targetUsers) { $userId = (Get-MgUser -UserId $user.Email).Id # 获取用户作为成员的组 $memberGroups = Get-MgUserMemberOf -UserId $userId | Where-Object {$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.group'} # 获取用户作为所有者的组 $ownerGroups = Get-MgUserOwnedObject -UserId $userId | Where-Object {$_.AdditionalProperties.'@odata.type' -eq '#microsoft.graph.group'} # 合并组并去重 $allGroups = $memberGroups + $ownerGroups | Select-Object Id -Unique # 执行移除操作 foreach ($group in $allGroups) { try { Remove-MgGroupMember -GroupId $group.Id -DirectoryObjectId $userId Write-Host "已移除用户 $($user.Email) 从组 $($group.Id)" } catch { Write-Error "移除失败:$_" } } }
4. 部署脚本到Azure Function
- 创建PowerShell类型的定时触发函数,触发表达式设置为
0 0 * * * *(实现每小时运行一次)。 - 将调整后的脚本粘贴到函数的
run.ps1文件中。 - 在函数「配置」选项卡添加应用设置(避免硬编码):
SHAREPOINT_SITE_URL:https://你的租户名.sharepoint.com/sites/目标站点TARGET_LIST_NAME:目标用户列表名称
- 安装依赖模块:进入函数「高级工具」→「Kudu」,在
site/wwwroot目录创建requirements.psd1文件,添加所需模块:@{ 'Microsoft.Graph.Users' = '2.x' 'Microsoft.Graph.Groups' = '2.x' 'PnP.PowerShell' = '2.x' }
5. 测试与验证
- 手动触发函数运行,查看「监控」选项卡日志,确认脚本是否正常读取列表、移除用户组。
- 等待定时触发,验证每小时运行的稳定性。
内容的提问来源于stack exchange,提问作者microsoftdeveloperdesigner
相关产品推荐
相关产品推荐

