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

PowerShell修改网络文件夹所有者时触发IdentityNotMappedException

解决AD文件夹重定向共享中Set-Acl修改所有者的IdentityNotMappedException问题

核心问题原因

通过UNC路径(\\Jupiter\Users)执行Set-Acl修改所有者时,PowerShell无法正确将域用户身份映射到网络共享的安全上下文,即使拥有完全控制权限也会触发该错误。此外,直接传递字符串格式的SID或用户名给SetOwner也可能导致身份解析失败。

解决方案

方法1:映射网络驱动器后操作

将共享映射为本地驱动器,规避UNC路径的身份映射问题:

# 映射共享为Z盘(使用域管理员身份,若当前会话已是管理员可省略Credential参数)
$adminCred = Get-Credential "YOUR_DOMAIN\YourAdminAccount"
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\Jupiter\Users" -Credential $adminCred

# 遍历所有用户文件夹
$userFolders = Get-ChildItem -Path Z:\ -Directory

foreach ($folder in $userFolders) {
    $targetUsername = $folder.Name
    # 获取启用的AD用户
    $adUser = Get-ADUser -Filter "SamAccountName -eq '$targetUsername'" -Properties SID | Where-Object Enabled
    if ($adUser) {
        try {
            # 获取文件夹ACL
            $acl = Get-Acl -Path $folder.FullName
            # 构造强类型的SecurityIdentifier对象
            $newOwner = [System.Security.Principal.SecurityIdentifier]$adUser.SID
            # 设置所有者并应用ACL
            $acl.SetOwner($newOwner)
            Set-Acl -Path $folder.FullName -AclObject $acl
            Write-Host "✅ 已更新 $targetUsername 文件夹的所有者" -ForegroundColor Green
        }
        catch {
            Write-Host "❌ 处理 $targetUsername 失败: $($_.Exception.Message)" -ForegroundColor Red
        }
    }
    else {
        Write-Host "⚠️ 未找到启用的AD用户 $targetUsername" -ForegroundColor Yellow
    }
}

# 清理映射的驱动器
Remove-PSDrive -Name Z

方法2:远程在服务器本地执行(推荐)

直接在共享所在的Jupiter服务器上执行脚本(或通过Invoke-Command远程执行),本地文件系统操作不会有身份映射问题:

# 远程连接Jupiter服务器执行脚本
Invoke-Command -ComputerName Jupiter -ScriptBlock {
    # 替换为服务器上共享的本地路径(比如D:\UserShares)
    $localSharePath = "C:\Path\To\Users\Shared\Folder"
    $userFolders = Get-ChildItem -Path $localSharePath -Directory

    foreach ($folder in $userFolders) {
        $targetUsername = $folder.Name
        $adUser = Get-ADUser -Filter "SamAccountName -eq '$targetUsername'" -Properties SID | Where-Object Enabled
        if ($adUser) {
            try {
                $acl = Get-Acl -Path $folder.FullName
                $newOwner = [System.Security.Principal.SecurityIdentifier]$adUser.SID
                $acl.SetOwner($newOwner)
                Set-Acl -Path $folder.FullName -AclObject $acl
                Write-Host "已更新 $targetUsername 文件夹所有者"
            }
            catch {
                Write-Warning "更新 $targetUsername 失败: $_"
            }
        }
    }
} -Credential (Get-Credential "YOUR_DOMAIN\YourAdminAccount")

关键注意事项

  • 先测试单个文件夹:在批量执行前,挑选一个文件夹单独运行脚本中的核心逻辑,确认无问题后再批量处理。
  • 确保用户文件夹名与AD用户的SamAccountName完全一致,否则会匹配失败。
  • 若遇到特殊字符或长路径问题,可在Get-ChildItem中添加-LiteralPath参数避免解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:03:28