PowerShell远程检查服务器文件夹权限并导出本地共享文件夹异常求助
问题分析与解决方案
你的脚本核心问题是误用了Enter-PSSession——它是交互式远程会话工具,在脚本中使用会导致变量上下文混乱:你输入的$Directory是在本地会话定义的,远程服务器无法识别;同时远程会话也无法可靠访问本地共享文件夹。正确的做法是用Invoke-Command实现脚本化远程执行,将权限数据返回本地后再导出CSV。
修改后的完整脚本
#Start of script # 获取基础配置信息 $Servername = Read-Host -Prompt "Servername" $Adminusername = Read-Host -Prompt "Admin user name" $Directory = Read-Host -Prompt "What directory and subfolders do you want to check (f.e. E:\Data\Shared_Data)?" # 定义本地CSV导出路径 $path = "\\本地计算机共享文件夹路径\" $Logdate = Get-Date -Format yyyyMMddHHmm $csvfile = Join-Path -Path $path -ChildPath "Permissions_$Servername_$LogDate.csv" # 远程执行权限收集逻辑,结果返回本地 $permissionResults = Invoke-Command -ComputerName $Servername -Credential (Get-Credential -UserName $Adminusername -Message "Enter password for $Adminusername") -ScriptBlock { param($TargetDir) # 遍历目标目录下所有子文件夹 Get-ChildItem -Path $TargetDir -Recurse -Directory | ForEach-Object { $folderPath = $_.FullName # 获取ACL并添加文件夹路径属性 Get-Acl -Path $folderPath | Select-Object -ExpandProperty Access | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name "FolderPath" -Value $folderPath -PassThru } } } -ArgumentList $Directory # 将结果导出到本地共享文件夹 $permissionResults | Export-Csv -Path $csvfile -NoTypeInformation Write-Host Write-Host "Export completed" Write-Host Read-Host -Prompt "Press Enter to exit" #End of script
关键改动说明
- 替换
Enter-PSSession为Invoke-Command:Invoke-Command专为脚本化远程执行设计,能在远程服务器上运行指定逻辑,并将结果完整返回本地,彻底避免交互式会话的上下文混乱。 - 参数传递机制:通过
-ArgumentList将本地输入的$Directory传递到远程脚本块,确保远程服务器能正确识别要检查的文件夹路径。 - 本地导出CSV:权限数据返回本地后再执行导出,无需远程服务器访问本地共享,规避了跨机器权限验证问题。
- 路径优化:用
Join-Path代替字符串拼接,避免手动拼接路径时出现格式错误。
注意事项
- 确保远程服务器已启用WinRM(PowerShell远程管理),可在远程服务器执行
Enable-PSRemoting -Force完成配置。 - 远程连接用的管理员账户,需同时拥有远程服务器的管理员权限、目标文件夹的读取权限。
- 本地共享文件夹需对执行脚本的账户开放写入权限。
内容的提问来源于stack exchange,提问作者Pisces
相关产品推荐
相关产品推荐

