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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:38:34