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
相关产品推荐
相关产品推荐

