web-dev-qa-db-ja.com

ネットワーク共有をテストすると、PowerShellTest-PathがFalseを返します

ユーザーには共有を読み取るための適切な権限があり、共有は適切にマップされます。この問題は、PowerShellv2.0でのみ発生するようです。

マップされたすべてのドライブを削除し、1つのドライブを再マップして、Test-Pathを実行する場合:

Net Use /delete * /y
Net Use G: \\somefileserver\share
Test-Path G:\

ドライブが明確にマップされていても、Test-PathはFalseを返し、Windowsエクスプローラーからアクセスできます。

PowerShellセッションを閉じて新しいセッションを開くと、Test-Pathは本来どおりTrueを返します。 (A):これを引き起こしている可能性のあるものと、それを適切に機能させるにはどうすればよいですか?または(B):Test-Path以外にネットワークドライブの存在をテストする別の方法はありますか?ユーザーのネットワークドライブをマップするためのログオンスクリプトを作成しようとしていますが、この動作が気が狂います。

8
user3418092

_Test-Path_コマンドレットに本当にバグがある場合は、_System.IO.Directory_。NETクラスでExists()メソッドを使用することをお勧めします。

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

私はこれで答えを見つけたと思います:

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

UNCを検証するには、次を使用します。

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

次のような2つのネットワークパスを試しても、まったく同じ問題が発生しました。

$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){[..]}

条件は受け入れられます。

ネットワークパスの最初の文字だけを入力するので、Test-pathコマンドレットは少しバグがあると思います...しかし、このように私はもうエラーを受け取りません...

0
Andy McRae

私にとってそれを修正する唯一の方法は、共有名ではなく、完全なUNCを使用することでした。

したがって、\\server\shareの代わりに\\server\c$\sharedirを使用しました。

私が遭遇したもう1つの問題は、Import-Module sqlpsを使用しているときに、ファイルシステムにCDを戻す必要があり、PowerShellコマンドが正常に機能することでした。

0
blizz

短い答え

if(-Not(Test-Path "filesystem::\\$server\c$")) {Write-Error "Server not found: $server"; continue}Test-Pathが予期せず失敗した場合は、 SMB2 = 1(または他のSMB設定)が設定されている クライアントサーバーとターゲットサーバーの両方で。

詳細情報

重要SMB注:現在のシステムとターゲットシステムの両方で、少なくとも共通のSMB Test-Pathが成功するためにプロトコルが有効になっています。(SMB2以降を強くお勧めします。)たとえば、ターゲットでSMB1が有効+ SMB2が無効で、クライアントでSMB2のみが有効になっている場合、上記のロジックはを返します。サーバーが見つかりません... "これにより、ターゲットサーバー(Win7)を最終的にチェックし、SMB2 = 0(無効)でSMB1のエントリがない(デフォルトで有効)ことがわかるまで、トラックから外れました。以下の記事ごとにSMB2 = 1を設定することで修正されました。

SMB OS固有のスクリプトの詳細: https://support.Microsoft.com/en-us/help/2696547/detect-enable-disable-smbv1-smbv2-smbv3-in-windows-and-windows-サーバー

抜粋: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

コードサンプル:コピー-ターゲットサーバーが存在する場合にのみフォルダーをアイテム化(再帰的)

$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."
} 
0