Windows下如何自动挂载用户有权限访问的所有SMB共享?
Windows下如何自动挂载用户有权限访问的所有SMB共享?
我完全懂你的困扰——同一台Windows机器上多个用户共用系统账号,但每个人有自己独立的SMB凭证,想要登录后自动挂载自己有权限的所有Samba服务器共享,还不能给每个用户单独写脚本,之前在Ubuntu上搞定过,现在Windows上却卡壳了,net view没法带凭证,net use又得逐个指定共享和盘符,确实头疼。
其实你可以试试用PowerShell脚本实现这个需求,它比Batch更灵活,能搞定凭证验证、共享枚举和自动挂载的全流程,具体步骤和脚本如下:
核心思路
- 先让用户输入SMB服务器地址和个人凭证,通过连接服务器的
IPC$共享完成身份验证(这个共享是系统默认的管道共享,专门用来做身份校验,不需要实际挂载); - 验证通过后,枚举该用户有权限访问的所有非系统共享;
- 自动找到Windows上未使用的盘符,逐个挂载这些共享。
具体脚本
# 提示用户输入服务器地址、用户名和密码 $server = Read-Host "请输入SMB服务器地址(格式:\\服务器名或IP)" $credential = Get-Credential -Message "请输入你的SMB账号凭证" # 先连接IPC$共享完成身份验证 try { New-SmbMapping -LocalPath "" -RemotePath "$server\IPC$" -Credential $credential -Persistent $false Write-Host "身份验证成功,开始获取可用共享..." } catch { Write-Error "身份验证失败:$_" exit 1 } # 获取服务器上的所有磁盘共享,过滤掉系统默认共享(比如IPC$、ADMIN$) $shares = Get-WmiObject -Class Win32_Share -ComputerName $server.Replace("\\", "") -Credential $credential | Where-Object { $_.Name -notmatch "^(IPC\$|ADMIN\$|C\$|D\$)$" -and $_.Type -eq 0 # Type=0代表磁盘共享 } # 遍历共享列表,自动分配可用盘符挂载 foreach ($share in $shares) { $remotePath = "$server\$($share.Name)" # 找到第一个未被使用的盘符 $driveLetter = Get-Volume | Where-Object { $_.DriveType -eq 'NoRootDirectory' } | Select-Object -First 1 -ExpandProperty DriveLetter if (-not $driveLetter) { Write-Warning "没有可用的盘符了,跳过共享 $($share.Name)" continue } # 挂载共享 try { New-SmbMapping -LocalPath "$driveLetter:\" -RemotePath $remotePath -Credential $credential -Persistent $true Write-Host "成功挂载共享 $($share.Name) 到 $driveLetter:\" } catch { Write-Warning "挂载共享 $($share.Name) 失败:$_" } } # 清理临时的IPC$连接 Remove-SmbMapping -RemotePath "$server\IPC$" -Force
使用说明
- 把上面的代码保存成
.ps1格式的文件(比如MountSMBShares.ps1); - 右键选择“用PowerShell运行”,按照提示输入服务器地址和你的SMB账号密码即可;
- 如果想让脚本更方便使用,可以创建一个快捷方式,目标指向
powershell.exe -ExecutionPolicy Bypass -File "你的脚本路径\MountSMBShares.ps1",这样双击就能运行。
一些注意事项
- 如果你的Samba服务器是老版本,可能需要在Windows上启用SMB 1.0/CIFS客户端(不过更建议升级服务器支持SMB3,更安全);
- 脚本里
-Persistent $true表示挂载的共享会在重启后保留,如果是共用账号,你可以改成$false,避免其他用户登录时看到你的共享; - 不要把密码硬编码到脚本里,毕竟是共用账号,安全性优先,每次输入更稳妥。
至于你提到的Ubuntu上的情况,其实是因为Ubuntu的gvfs系统会自动枚举用户有权限的SMB共享,但Windows原生没有这个功能,所以需要靠脚本补全这个逻辑~
备注:内容来源于stack exchange,提问作者adrifromhh




