Invoke-Command调用Get-ACL返回空值或错误所有者问题求助
解决PowerShell远程获取文件所有者为空/错误的问题
我之前也碰到过一模一样的问题!远程执行时Get-ACL返回的Owner总是不对,但本地跑就正常,核心问题大多出在远程会话的权限上下文或者SID解析失败上,给你几个具体的排查和解决办法:
1. 显式解析SID到账户名
远程会话中,有时候Get-Acl返回的Owner是原始SID而非友好账户名,甚至因为会话无法访问AD或本地用户数据库导致解析失败,显示空值或默认管理员组。我们可以手动解析SID:
修改你远程脚本块中的Owner获取逻辑,替换成下面的代码:
Invoke-Command -ComputerName $a -Credential $yourCred -ScriptBlock { Get-ChildItem $using:b -Recurse | ForEach-Object { # 获取文件ACL,添加错误处理避免中断 $acl = Get-Acl -Path $_.FullName -ErrorAction SilentlyContinue $owner = "未知" if ($acl) { try { # 把SID转换为NT账户名 $sidObj = New-Object System.Security.Principal.SecurityIdentifier($acl.Owner) $owner = $sidObj.Translate([System.Security.Principal.NTAccount]).Value } catch { $owner = "解析失败: $($_.Exception.Message)" } } else { $owner = "无法获取ACL" } # 输出包含Owner的自定义对象 [PSCustomObject]@{ FullName = $_.FullName Name = $_.Name Owner = $owner Length = $_.Length LastWriteTime = $_.LastWriteTime } } }
2. 确保远程会话有足够权限
虽然你说凭据没问题,但远程会话的权限可能和本地登录有差异:
- 确认你的凭据是目标机器的本地管理员或拥有读取文件ACL权限的账户
- 如果目标机器开启了UAC,尝试在远程脚本块中以管理员身份执行(可以用
Start-Process powershell -Verb RunAs嵌套执行,但需要注意参数传递)
3. 排查双跳问题(如果涉及文件共享)
如果你的$b路径是网络共享(而非目标机器的本地路径),会碰到Kerberos双跳问题——远程会话无法将你的凭据传递到另一台机器的共享。这时候需要启用CredSSP:
- 本地机器执行:
Enable-WSManCredSSP -Role Client -DelegateComputer "目标机器名或*" - 目标机器执行:
Enable-WSManCredSSP -Role Server - 然后Invoke-Command加上
-Authentication Credssp参数
4. 测试单个文件的Owner获取
先简化脚本,远程获取单个文件的Owner来排查:
Invoke-Command -ComputerName $a -Credential $yourCred -ScriptBlock { $testFile = "C:\test\example.txt" $acl = Get-Acl $testFile $sidObj = New-Object System.Security.Principal.SecurityIdentifier($acl.Owner) $sidObj.Translate([System.Security.Principal.NTAccount]).Value }
如果这个能返回正确结果,说明问题出在批量处理的逻辑里;如果还是错,那就是权限或会话配置的问题。
内容的提问来源于stack exchange,提问作者dizbuster
相关产品推荐
相关产品推荐

