当 运行 为 "SYSTEM" 时,Get-ChildItem return 访问被拒绝错误
Get-ChildItem return access denied error when run as "SYSTEM"
我正在尝试创建脚本以通过网络获取文件夹的内容。我注意到 Get-Childitem 在列表中的所有其他 IP 地址上抛出“拒绝访问”错误。
例如我列出的 IP 是这样的:
- IP1
- IP2
- IP3
- IP4
Get-ChildItem 适用于 IP1 和 IP3,但 return 访问被拒绝错误适用于 IP2 和 IP4。只有当我 运行 控制台上的脚本 运行 作为 SYSTEM 时才会发生这种情况。
编辑: 我为其创建此脚本的远程工具只能 运行 控制台作为系统
谁能告诉我代码中是否有任何可能导致此问题的地方?
#Set Variables
$pw = Read-Host -AsSecureString "Enter password"
$usrname = 'username'
$folderpath = 'C$\Folder\Subfolder1\Subfolder'
#Loop
foreach ($ipaddress in Get-Content -Path .\DeviceIPList.txt) {
$credential = New-Object System.Management.Automation.PsCredential("$ipaddress$usrname",$pw)
Try {
if ($(Test-Path drv:) -eq 'True') {
Remove-PSDrive "drv"
} else {
New-PSDrive -Name "drv" -PSProvider FileSystem -Root "\$ipaddress\C$" -Credential $credential -ErrorAction Stop | Out-Null
}
$vhdfile = Get-ChildItem -path "\$ipaddress$folderpath" -ErrorAction Stop
Write-Host -ForegroundColor Green "$ipaddress,Found $vhdfile in $($folderpath.Replace('$',':'))"
Write-Output "$ipaddress,Found $vhdfile in $($folderpath.Replace('$',':'))" | 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()
Start-Sleep -Seconds 2
net use \$ipaddress$folderpath /d 2>&1>$null
}
}
如果 drv:
存在,您在此处的 if
语句将删除它, 但 不会创建新驱动器。尝试将 New-PSDrive
移到 Else
之外:
if ($(Test-Path drv:) -eq 'True') {
Remove-PSDrive "drv"
}
New-PSDrive -Name "drv" -PSProvider FileSystem -Root "\$ipaddress\C$" -Credential $credential -ErrorAction Stop | Out-Null
这是一个问题,因为您在 Get-ChildItem
中使用了整个 \$ip\c$\
unc。如果 drv:
被删除,那么您要求 Get-ChildItem
以当前用户身份连接,这不会像 system
那样工作。这也可能是您可以每隔 其他 次连接一次的原因。
使用 drv:
应该会通过抛出“drv:
不存在”类型的错误来告诉您这是否是问题所在:
$folderpath = 'Folder\Subfolder1\Subfolder'
$vhdfile = Get-ChildItem -path "drv:$folderpath" -ErrorAction Stop
可能是 SYSTEM 无法使用 net use /d
删除 PSDrive - 它可能会抛出错误,但您已取消其输出。请尝试在此处再次使用 Remove-PSDrive
:
Finally {
$error.Clear()
Start-Sleep -Seconds 2
Remove-PSDrive "drv"
}
运行 因为系统很好,因为您为 New-PSDrive
.
提供了不同的凭据
我正在尝试创建脚本以通过网络获取文件夹的内容。我注意到 Get-Childitem 在列表中的所有其他 IP 地址上抛出“拒绝访问”错误。
例如我列出的 IP 是这样的:
- IP1
- IP2
- IP3
- IP4
Get-ChildItem 适用于 IP1 和 IP3,但 return 访问被拒绝错误适用于 IP2 和 IP4。只有当我 运行 控制台上的脚本 运行 作为 SYSTEM 时才会发生这种情况。 编辑: 我为其创建此脚本的远程工具只能 运行 控制台作为系统
谁能告诉我代码中是否有任何可能导致此问题的地方?
#Set Variables
$pw = Read-Host -AsSecureString "Enter password"
$usrname = 'username'
$folderpath = 'C$\Folder\Subfolder1\Subfolder'
#Loop
foreach ($ipaddress in Get-Content -Path .\DeviceIPList.txt) {
$credential = New-Object System.Management.Automation.PsCredential("$ipaddress$usrname",$pw)
Try {
if ($(Test-Path drv:) -eq 'True') {
Remove-PSDrive "drv"
} else {
New-PSDrive -Name "drv" -PSProvider FileSystem -Root "\$ipaddress\C$" -Credential $credential -ErrorAction Stop | Out-Null
}
$vhdfile = Get-ChildItem -path "\$ipaddress$folderpath" -ErrorAction Stop
Write-Host -ForegroundColor Green "$ipaddress,Found $vhdfile in $($folderpath.Replace('$',':'))"
Write-Output "$ipaddress,Found $vhdfile in $($folderpath.Replace('$',':'))" | 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()
Start-Sleep -Seconds 2
net use \$ipaddress$folderpath /d 2>&1>$null
}
}
如果 drv:
存在,您在此处的 if
语句将删除它, 但 不会创建新驱动器。尝试将 New-PSDrive
移到 Else
之外:
if ($(Test-Path drv:) -eq 'True') {
Remove-PSDrive "drv"
}
New-PSDrive -Name "drv" -PSProvider FileSystem -Root "\$ipaddress\C$" -Credential $credential -ErrorAction Stop | Out-Null
这是一个问题,因为您在 Get-ChildItem
中使用了整个 \$ip\c$\
unc。如果 drv:
被删除,那么您要求 Get-ChildItem
以当前用户身份连接,这不会像 system
那样工作。这也可能是您可以每隔 其他 次连接一次的原因。
使用 drv:
应该会通过抛出“drv:
不存在”类型的错误来告诉您这是否是问题所在:
$folderpath = 'Folder\Subfolder1\Subfolder'
$vhdfile = Get-ChildItem -path "drv:$folderpath" -ErrorAction Stop
可能是 SYSTEM 无法使用 net use /d
删除 PSDrive - 它可能会抛出错误,但您已取消其输出。请尝试在此处再次使用 Remove-PSDrive
:
Finally {
$error.Clear()
Start-Sleep -Seconds 2
Remove-PSDrive "drv"
}
运行 因为系统很好,因为您为 New-PSDrive
.