如何用Exchange PowerShell(普通用户权限)获取用户可见的邮箱及文件夹?
嘿 Marius,我来帮你搞定这个问题!
普通用户凭据下获取有权限的邮箱及文件夹方案
首先得明确:普通用户默认确实没法用Get-Mailbox直接列出所有邮箱,这是Exchange的权限限制导致的。不过咱可以换个思路——不先枚举所有邮箱再查权限,而是从用户已经能访问的对象入手,有两种可行路径:
路径1:用Exchange Web Services (EWS) 替代PowerShell(推荐)
对于你的ASP.NET应用来说,EWS其实是更顺手的选择,因为它天生支持普通用户枚举自己有FolderVisible权限的资源,不需要额外调整Exchange服务器权限。
示例C#代码片段
先安装Microsoft.Exchange.WebServices NuGet包,然后可以用这段代码来实现需求:
using Microsoft.Exchange.WebServices.Data; // 初始化EWS服务连接 ExchangeService ewsService = new ExchangeService(ExchangeVersion.Exchange2016); ewsService.Credentials = new WebCredentials("普通用户账号", "用户密码"); ewsService.Url = new Uri("https://你的Exchange服务器地址/EWS/Exchange.asmx"); // 获取当前用户有权限访问的所有邮箱(含共享邮箱) NameResolutionCollection accessibleMailboxes = ewsService.ResolveName("", ResolveNameSearchLocation.DirectoryOnly, true); foreach (NameResolution mailbox in accessibleMailboxes) { if (mailbox.Mailbox.Type is MailboxType.Mailbox or MailboxType.PublicFolder) { // 绑定到该邮箱的根文件夹 Folder rootFolder = Folder.Bind(ewsService, new FolderId(WellKnownFolderName.MsgFolderRoot, mailbox.Mailbox.Address)); // 递归遍历文件夹并检查权限 TraverseAccessibleFolders(ewsService, rootFolder, mailbox.Mailbox.Address); } } // 递归遍历文件夹的方法 void TraverseAccessibleFolders(ExchangeService service, Folder parentFolder, string mailboxAddress) { foreach (Folder folder in parentFolder.FindFolders(new FolderView(100))) { // 获取当前用户对该文件夹的权限 FolderPermissionCollection permissions = folder.GetPermissions(); foreach (FolderPermission perm in permissions) { if (perm.UserId.PrimarySmtpAddress == service.Credentials.UserName && perm.FolderPermissionLevel == FolderPermissionLevel.FolderVisible) { // 这里可以把结果存入你的应用数据结构 Console.WriteLine($"邮箱: {mailboxAddress}, 可见文件夹: {folder.DisplayName}"); // 继续遍历子文件夹 TraverseAccessibleFolders(service, folder, mailboxAddress); } } } }
路径2:调整PowerShell权限(需管理员操作)
如果你的环境允许管理员给普通用户分配有限的PowerShell权限,也可以通过这种方式实现:
第一步:管理员配置权限
管理员需要在Exchange服务器上执行以下命令,创建一个仅允许查看有权限邮箱和文件夹的自定义角色:
# 创建自定义管理角色 New-ManagementRole -Name "ViewAccessibleMailboxes" -Parent "Mailbox Recipients" # 移除不必要的权限项,只保留需要的 Remove-ManagementRoleEntry -Identity "ViewAccessibleMailboxes\Get-Mailbox" Add-ManagementRoleEntry -Identity "ViewAccessibleMailboxes\Get-Mailbox" -Parameters Identity, DisplayName, PrimarySmtpAddress Add-ManagementRoleEntry -Identity "ViewAccessibleMailboxes\Get-MailboxFolderPermission" # 创建角色组并添加目标用户 New-RoleGroup -Name "AccessibleMailboxViewers" -Roles "ViewAccessibleMailboxes" Add-RoleGroupMember -Identity "AccessibleMailboxViewers" -Member "普通用户账号"
第二步:普通用户执行查询
权限配置完成后,普通用户就可以用PowerShell脚本获取有权限的邮箱和文件夹了:
$currentUser = $env:USERNAME # 获取所有当前用户有FolderVisible权限的邮箱 $accessibleMailboxes = Get-Mailbox -ResultSize Unlimited | Where-Object { $rootPerms = Get-MailboxFolderPermission -Identity "$($_.PrimarySmtpAddress):\\" -User $currentUser -ErrorAction SilentlyContinue $rootPerms -ne $null -and $rootPerms.FolderPermissionLevel -eq "FolderVisible" } # 遍历每个邮箱的子文件夹,筛选可见项 foreach ($mbx in $accessibleMailboxes) { Write-Host "=== 邮箱: $($mbx.DisplayName) ===" Get-MailboxFolderStatistics -Identity $mbx.PrimarySmtpAddress | ForEach-Object { $folderPath = $_.FolderPath.Replace("/", "\") $folderPerm = Get-MailboxFolderPermission -Identity "$($mbx.PrimarySmtpAddress):$folderPath" -User $currentUser -ErrorAction SilentlyContinue if ($folderPerm -and $folderPerm.FolderPermissionLevel -eq "FolderVisible") { Write-Host " 文件夹: $folderPath" } } }
注意:这种方法需要遍历所有邮箱,数据量大时可能有性能问题,建议按需优化。
总结
如果不想碰Exchange服务器的权限配置,EWS是更适合你的方案,它完全适配普通用户凭据,还能无缝集成到ASP.NET应用中;如果可以协调管理员配置权限,PowerShell也是可行的,但要注意性能优化。
内容的提问来源于stack exchange,提问作者Counterdoc
相关产品推荐
相关产品推荐

