检查共享驱动器是否已映射

时间:2018-07-13 12:39:55

标签: powershell

我第一次使用PowerShell检查unc路径是否已经映射,是否删除它以在特定凭据下再次创建它。

我发现的问题是,如果该路径在网络使用列表中存在但具有驱动器号,则必须通过该驱动器号将其删除,这当然可以是随机的。因此,我需要在匹配时找到驱动器号,但对如何却一无所知。

$userPass = '/user:Domain\User password';
$ltr = ls function:[d-z]: -n | ?{ !(test-path $_) } | random;
$share = '\\\\server\\folder';
$newMap = 'net use '+ $ltr + ' '$share + ' '$userPass;
foreach ($con in net use) {
    if ($con -match $share) {
        $MappedLetter = /*something here to find the matched drive?*/
        if ($MappedLetter) {
            net use $MappedLetter /delete
        } else {
            net use $share /delete
        }
    }
};

net use $newMap;

[编辑]

我已经尝试过Get-PSDrive,但这仅在UNC路径映射到驱动器的情况下有效。由于这些有时可能是“僵尸”,即存在于net use中但没有字母,因此该方法并不总是有效。我可以结合使用两种方法(在Get-PSDrive上方),但是如果有人有更简洁的方法,请告诉我!

1 个答案:

答案 0 :(得分:7)

您应该能够检查是否已经通过Get-PSDrive映射了特定共享:

$share = '\\server\share'

$drive = Get-PSDrive |
         Where-Object { $_.DisplayRoot -eq $share } |
         Select-Object -Expand Name

if ($drive) {
    "${share} is already mapped to ${drive}."
}

如果您只想在映射驱动器的情况下将其删除,则可以执行以下操作:

Get-PSDrive | Where-Object {
    $_.DisplayRoot -eq $share
} | Remove-PSDrive

更新

AFAIK PowerShell无法枚举和直接删除断开连接的驱动器。您可以从注册表中获取该信息:

$share = '\\server\share'
$drive = Get-ItemProperty 'HKCU:Network\*' |
         Where-Object { $_.RemotePath -eq $share } |
         Select-Object -Expand PSChildName

或从net use输出中解析出来:

net use | Where-Object {
    $_ -match '(?<=^Unavailable\s+)\w:'
} | ForEach-Object {
    $matches[0]
}

但是,据我所知,只要断开驱动器的连接,仍然无法将其卸下(例如,通过net use)。要删除断开连接的驱动器(例如,当共享永久变得不可用时),您需要从注册表中删除映射信息:

$share = '\\server\share'
Get-ItemProperty 'HKCU:Network\*' |
    Where-Object { $_.RemotePath -eq $share } |
    Remove-Item

# also remove mount point in Windows Explorer
$key = 'Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2'
$subkey = Join-Path $key ($share -replace '\\', '#')
Get-ItemProperty "HKCU:${subkey}" | Remove-Item