测试网络共享时,PowerShell测试路径返回False

测试网络共享时,PowerShell测试路径返回False,powershell,powershell-2.0,network-drive,net-use,Powershell,Powershell 2.0,Network Drive,Net Use,用户具有读取共享的适当权限,并且共享映射正确。 此问题似乎仅在PowerShell v2.0中出现 如果删除所有映射的驱动器,请重新映射一个驱动器,然后运行测试路径: net use /delete * /y net use G: \\somefileserver\share Test-Path G:\ 测试路径返回False,即使驱动器已清晰映射,并且我可以通过Windows资源管理器访问它 如果关闭PowerShell会话并打开一个新会话,测试路径将返回True,这是应该的。关于(A)有什

用户具有读取共享的适当权限,并且共享映射正确。 此问题似乎仅在PowerShell v2.0中出现

如果删除所有映射的驱动器,请重新映射一个驱动器,然后运行测试路径:

net use /delete * /y
net use G: \\somefileserver\share
Test-Path G:\
测试路径返回False,即使驱动器已清晰映射,并且我可以通过Windows资源管理器访问它


如果关闭PowerShell会话并打开一个新会话,测试路径将返回True,这是应该的。关于(A)有什么想法吗?是什么原因造成的?我如何使它正常工作?或者(B):除了测试路径之外,还有其他方法测试网络驱动器的存在吗?我正试图编写登录脚本来映射用户的网络驱动器,这种行为让我发疯。

如果
测试路径
cmdlet确实有缺陷,那么我建议使用
System.IO.Directory
NET类上的
Exists()
方法

[System.IO.Directory]::Exists('G:\'); # This returns $true for me

要验证UNC,请使用:

[bool]([System.Uri]$path).IsUnc

对我来说,修复它的唯一方法是使用完整的UNC,而不是共享名

因此,我使用了
\\server\share
而不是
\\server\c$\sharedir


我遇到的另一个问题是,在使用
导入模块sqlps
时,我必须确保
CD
返回到文件系统,然后PowerShell命令正常工作。

我确实认为我找到了这个问题的答案:

Test-Path $('filesystem::\\Server\share$\install.wim')

我在尝试以下两种网络路径时遇到了完全相同的问题:

$verif_X = Test-Path "X:\"
$verif_S = Test-Path "S:\"
if($verif_X -and $verif_S){
    Write-Host "X: and S: network paths found"
}
else{
    Write-Host "Not all network paths found"
}
$verif_X = Test-Path 'X:\ISOs'
$verif_S = Test-Path 'S:\Scripts'
。。。起初,我总是得到>“没有找到所有的网络路径”,这对我来说真的很奇怪

然后我尝试将这些路径放在简单的引号(')中,并在这两个网络路径中搜索一个现有文件夹,如下所示:

$verif_X = Test-Path "X:\"
$verif_S = Test-Path "S:\"
if($verif_X -and $verif_S){
    Write-Host "X: and S: network paths found"
}
else{
    Write-Host "Not all network paths found"
}
$verif_X = Test-Path 'X:\ISOs'
$verif_S = Test-Path 'S:\Scripts'
然后

if($verif_X -and $verif_S){[..]}
条件是可以接受的


我认为TestPath cmdlet有点问题,因为我们只输入网络路径的第一个字母。。。但是像这样,我再也没有错误了…

简短的回答

if(-Not(测试路径“filesystem::\\$server\c$”){Write Error“server Not found:$server”;continue}
如果测试路径意外失败,请确保在客户端和目标服务器上都失败

更多信息

重要SMB注意:当前系统和目标系统必须至少启用了通用SMB协议,测试路径才能成功。(强烈建议使用SMB2或更高版本。)例如,如果目标启用了SMB1+SMB2,而客户端仅启用了SMB2,则上面的逻辑将返回“未找到服务器…”。这使我偏离了轨道,直到我最终检查了我的目标服务器(Win7),发现它有SMB2=0(已禁用),并且没有SMB1的条目(默认情况下已启用)。我通过在下面的每篇文章中设置SMB2=1进行了修复

SMB操作系统特定和脚本详细信息:

摘录:Win8/Win20012

Detect: Get-SmbServerConfiguration | Select EnableSMB1Protocol
Disable:    Set-SmbServerConfiguration -EnableSMB1Protocol $false
Enable: Set-SmbServerConfiguration -EnableSMB1Protocol $true
摘录:Win7/Win2008R2Server

Detect:
Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
Default configuration = Enabled (No registry key is created), so no SMB1 value will be returned

Disable:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force

Enable:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force

代码示例:仅当目标服务器存在时才复制项目a文件夹(递归)

$scriptRootPath="." 
$scriptToolsPath="$scriptRootPath\Tools" 
$targetServerList="$scriptToolsPath\DeployServerList-INT-POC.txt"   #DeployServerList-INT.txt, DeployServerList-QA.txt, DeployServerList-PROD.txt
$stageTargetDrive="c"
$stageFolderPath="$stageTargetDrive$\staging"

$VerbosePreference="Continue"                                       #"SilentlyContinue" (default), "Continue", "Stop", "Inquire"
$InformationPreference="Continue"

Write-Host "Getting list of servers from $targetServerList to stage deployment files to..."
    $serverList = (get-content "$targetServerList")
    Write-Verbose "scriptToolsPath=$scriptToolsPath"
    Write-Verbose "serverlist=$serverList"
    Write-Verbose "stageFolderPath=$StageFolderPath"

Write-Host -Separator "-"
Read-Host -Prompt "READY TO STAGE FILES: Check info above, then press Enter to continue (or Ctrl+C to exit)."
Write-Host "-------------------------------------------------"

Write-Host "Staging files to $stageFolderPath on each target server..."
foreach ($server in $serverlist) {
    # Input validation
    if([string]::IsNullOrWhiteSpace($server)) {continue}
    if($server.StartsWith("#")) {Write-Verbose "Comment skipped: $server"; continue}    # Skip line if line begins with hashtag comment char
    Write-Verbose "Testing filesystem access to $server..."
    if(-Not(Test-Path "filesystem::\\$server\$stageTargetDrive$")) {Write-Error "Server not found: $server"; continue}
        # TIP: If Test-Path returns false unexpectedly then check if SMB2 is enabled on target server, check SMB1 disabled for both src and target servers.

    Write-Verbose "Staging files to $server..."
    Copy-Item ".\" -Destination "\\$server\$stageFolderPath" -Recurse -Force -ErrorAction Continue
    Write-Information "Files staged on $server."
} 

仅供记录:这在PSV3.0中运行良好。尽管在任何版本中,启动提升为管理员的PS都会有所不同。映射为标准用户的驱动器在提升的PS中不可见。在尝试上述操作时,我应该在何处释放?试过了,它在UNC路径下不起作用,但是本地补丁它起作用了,但我认为是我没有完全理解Q和a…?\\server\share和\\server\c$\shareddir不是一回事。它们具有相同的NTFS ACL,但共享ACL不同。这实际上并不测试路径-它只是测试解析的字符串是否为UNC路径。要验证参数,我将使用
[ValidateScript({(测试路径$)-和([System.Uri]$..IsUnc})]
。只是因为这可以帮助别人。谢谢@danatkinson子表达式不是必需的,即
testpath'文件系统:\\\Server\share$\install.wim'
可以