非域环境下如何实现NAS可访问共享文件夹的自动映射?
实现自动映射NAS所有可访问共享文件夹的PowerShell脚本
完整脚本
# 提示用户输入NAS信息与凭据 $nasName = Read-Host "请输入NAS的名称或IP地址" $nasUsername = Read-Host "请输入NAS的用户名" $nasPassword = Read-Host "请输入NAS的密码" -AsSecureString # 将凭据转换为明文(仅用于cmdkey存储,执行后自动清理) $plainPassword = [System.Net.NetworkCredential]::new("", $nasPassword).Password # 存储NAS凭据到Windows凭据管理器 cmdkey /add:$nasName /user:$nasUsername /pass:$plainPassword # 清理明文密码变量 Remove-Variable plainPassword # 枚举NAS上的所有共享文件夹 $shares = Get-WmiObject -Class Win32_Share -ComputerName $nasName -ErrorAction SilentlyContinue | Where-Object { # 过滤系统默认共享(如ADMIN$、C$等)和非文件系统共享 $_.Name -notmatch '^\$' -and $_.Type -eq 0 } # 定义可用盘符范围(从Z往前找未被占用的) $availableDrives = @() for ($char = [char]'Z'; $char -ge [char]'D'; $char--) { $driveLetter = [string]$char if (-not (Get-PSDrive -Name $driveLetter -ErrorAction SilentlyContinue)) { $availableDrives += $driveLetter } } # 逐一映射可访问的共享 if ($shares) { Write-Host "开始映射共享文件夹..." $driveIndex = 0 foreach ($share in $shares) { if ($driveIndex -ge $availableDrives.Count) { Write-Warning "可用盘符不足,跳过共享: $($share.Name)" continue } $driveLetter = $availableDrives[$driveIndex] $sharePath = "\\$nasName\$($share.Name)" # 尝试访问共享,验证权限 try { $null = Get-ChildItem -Path $sharePath -ErrorAction Stop New-PSDrive -Name $driveLetter -Root $sharePath -Persist -PSProvider FileSystem -ErrorAction Stop Write-Host "成功映射: $sharePath -> $driveLetter:" $driveIndex++ } catch { Write-Warning "无权限访问或映射失败: $sharePath" } } } else { Write-Warning "未找到NAS上的可用共享文件夹,或无法连接到NAS" }
脚本说明
- 凭据处理:通过
Read-Host获取用户输入,密码以安全字符串形式存储,仅临时转为明文用于凭据管理器存储,之后立即清理,降低泄露风险 - 共享枚举:用
Get-WmiObject枚举NAS共享,过滤掉系统隐藏共享和非文件系统类共享 - 盘符分配:从Z到D反向查找未被占用的盘符,避免占用系统默认盘符(如C:)
- 权限验证:映射前先尝试访问共享,确保当前用户有权限,避免无效映射操作
- 持久化映射:使用
-Persist参数,保证重启后映射关系依然有效
注意事项
- 运行脚本需要管理员权限,否则
New-PSDrive的-Persist参数可能无法生效 - 确保客户端能正常访问NAS的SMB端口(默认445)
- 若NAS使用非默认SMB协议版本,可在脚本开头添加
Set-SmbClientConfiguration -RequireSecuritySignature $false(根据实际情况调整)
内容的提问来源于stack exchange,提问作者ProprietaryCloudGaming
相关产品推荐
相关产品推荐

