以SYSTEM身份运行Get-ChildItem出现间歇性访问被拒绝错误
问题根因分析
你遇到的间隔报错问题完全是代码逻辑错误导致的,具体问题如下:
- 核心逻辑错误:PSDrive的创建分支写反
当前代码逻辑为:如果drv盘已存在就仅删除,不创建新IP对应的PSDrive;仅当drv盘不存在时才创建。第一次循环时drv不存在,创建IP1对应的PSDrive,访问正常;第二次循环drv已存在,仅删除不创建IP2的PSDrive,直接访问UNC路径无有效凭据,报错;第三次循环drv已被删除,创建IP3对应的PSDrive,访问正常;第四次循环drv存在,仅删除不创建,又报错,完全匹配你间隔报错的现象。 - 凭据未正确关联到访问路径
你给\\$ipaddress\C$创建了带凭据的PSDrive,但Get-ChildItem访问的是UNC路径而非drv:盘,默认状态下PSDrive的凭据不会自动应用到同IP的其他UNC路径访问请求上,SYSTEM身份本身无默认远程访问权限,直接访问自然报错。 - SMB会话清理逻辑错误
Finally块中执行net use删除的路径是\\$ipaddress\$folderpath,但你实际建立的SMB连接根路径是\\$ipaddress\C$,清理路径不匹配会导致SMB会话残留,后续同IP访问会复用无效会话。
修复后代码
#Set Variables $pw = Read-Host -AsSecureString "Enter password" $usrname = 'username' $folderpath = 'Folder\Subfolder1\Subfolder' #Loop foreach ($ipaddress in Get-Content -Path .\DeviceIPList.txt) { $credential = New-Object System.Management.Automation.PsCredential("$ipaddress\$usrname",$pw) Try { # 每次循环先清理旧的PSDrive,不管是否存在 if (Test-Path drv:) { Remove-PSDrive "drv" -Force -ErrorAction SilentlyContinue } # 每次都新建当前IP的PSDrive,加Scope Global确保SYSTEM身份下全局生效 New-PSDrive -Name "drv" -PSProvider FileSystem -Root "\\$ipaddress\C$" -Credential $credential -Scope Global -ErrorAction Stop | Out-Null # 直接用挂载的drv盘访问,确保凭据生效 $vhdfile = Get-ChildItem -path "drv:\$folderpath" -ErrorAction Stop Write-Host -ForegroundColor Green "$ipaddress,Found $vhdfile in C:\$folderpath" Write-Output "$ipaddress,Found $vhdfile in C:\$folderpath" | Out-File -Append .\Report.txt } Catch [System.ComponentModel.Win32Exception] { Write-Host -ForegroundColor Cyan "$ipaddress,$_" Write-Output "$ipaddress,$_" | Out-File -Append .\Report.txt } Catch { Write-Host -ForegroundColor Yellow "$ipaddress,$_" Write-Output "$ipaddress,$_" | Out-File -Append .\Report.txt } Finally { $error.Clear() # 双重清理避免SMB会话残留 if (Test-Path drv:) { Remove-PSDrive "drv" -Force -ErrorAction SilentlyContinue } net use \\$ipaddress\C$ /d /y 2>&1>$null Start-Sleep -Seconds 1 } }
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

