修改远程计算机文件夹权限时遇Access denied错误求助
解决远程文件夹添加权限时的Access Denied问题
咱们先把问题拆明白:你用系统用户启动的脚本,切换到域用户会话后执行权限修改,但访问\\remote-computer\test时被拒绝。这里面有几个权限和远程会话的关键问题,咱们一步步来搞定:
1. 先搞懂当前会话的权限边界
你创建的PS会话是连到本地计算机($Env:ComputerName),不是目标远程机器。这时候在本地会话里跑test.ps1,脚本里的\\remote-computer\test是从本地发起访问的,用的是域用户在本地的权限,不是在远程机器上的权限——这是第一个核心坑!
2. 把会话直接连到远程计算机,在目标机器上下文执行
应该把PS会话的目标改成远程计算机,这样所有操作都在远程机器的环境里跑,用本地路径(比如C:\test)代替UNC路径,既避免跨机器权限传递问题,也更可靠。修改你的用户上下文切换代码:
$username = "domain\username" $password = "Password" $securePassword = ConvertTo-SecureString $password -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword # 重点:连接到目标远程计算机,不是本地! $session = New-PSSession -ComputerName "remote-computer" -Credential $credential # 先确认会话身份对不对 Invoke-Command -Session $session -ScriptBlock { whoami } # 执行权限修改脚本——注意:如果远程机器上没有test.ps1,得先把脚本传过去,或者直接把逻辑写在ScriptBlock里 Invoke-Command -Session $session -FilePath "C:\Users\Desktop\test.ps1"
3. 调整权限脚本,用远程机器的本地路径
在远程会话里,直接用远程机器的本地路径(比如C:\test,对应共享的\\remote-computer\test),比UNC路径少一层共享权限验证,更稳定:
修改test.ps1:
$colRights = [System.Security.AccessControl.FileSystemRights]"Read, Write" $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None $objType = [System.Security.AccessControl.AccessControlType]::Allow $objUser = New-Object System.Security.Principal.NTAccount("domain\username") $objACE = New-Object System.Security.AccessControl.FileSystemAccessRule ($objUser, $colRights, $InheritanceFlag, $PropagationFlag, $objType) # 用远程机器的本地路径,别用UNC了 $objACL = Get-ACL "C:\test" $objACL.AddAccessRule($objACE) Set-ACL "C:\test" $objACL
4. 确保域用户有足够的权限
- 域用户
domain\username得是远程计算机的本地管理员,或者至少拥有目标文件夹的修改ACL权限(也就是能改文件夹的安全设置)。 - 检查共享权限:
\\remote-computer\test的共享权限得给域用户至少Read权限,不然连UNC路径都访问不了(不过咱们改成本地路径后这一步可以忽略,但还是得确认下)。
5. 要是必须用UNC路径?排查Kerberos双跳
如果实在得用UNC路径,可能会碰到Kerberos双跳问题:本地会话的域用户身份没法传递到远程机器的共享上。这时候需要确保域用户允许委派,并且本地和远程机器的Kerberos信任正常——不过说实话,直接用远程本地路径是最简单的解决方式,没必要折腾这个。
额外排查小技巧
- 手动用域用户登录远程机器,手动改一次文件夹权限,看能不能成功。如果手动都不行,那就是域用户本身权限不够,先搞定这个基础问题。
- 在远程会话里跑
Test-Path "\\remote-computer\test",看看能不能访问,验证共享权限是否正常。
内容的提问来源于stack exchange,提问作者hans
相关产品推荐
相关产品推荐

