如何在远程计算机会话中启用映射驱动器 远程创建不显示
根因
该故障由Windows的两层原生机制导致,和DFS服务本身无关:
- 映射驱动器是用户会话绑定对象,不是系统全局对象。你通过自定义PSSession配置+RunAs身份远程执行命令时,启动的是独立的非交互式登录会话,和你手动登录服务器2打开的交互式桌面会话完全隔离。无报错是因为映射确实在这个临时远程会话里创建成功了,但该会话关闭后映射就会释放,且不会同步到其他独立会话,因此本地登录时看不到。
- 默认PowerShell远程会话不会完整加载用户配置外壳,
New-PSDrive -Persist参数在非交互式会话中默认只会将映射写入当前会话的作用域,不会持久化到用户配置的网络映射存储区,除非显式指定全局作用域并关闭UAC令牌过滤。
解决方案
根据你的使用场景二选一即可:
方案1:创建服务器全局可见的映射(推荐服务器场景使用)
该方式创建的映射对所有登录服务器的用户生效,不依赖用户会话,稳定性最高,远程执行代码如下:
Invoke-Command -ComputerName $SecondaryServer -ScriptBlock { # 写入系统级DOS设备映射表 $regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices" New-ItemProperty -Path $regPath -Name "T:" -Value "\??\UNC\abc.local\Demo1" -PropertyType String -Force # 广播系统配置变更通知,无需重启即可生效 Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class Win32Notify { [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)] public static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam, uint fuFlags, uint uTimeout, out UIntPtr lpdwResult); } "@ $HWND_BROADCAST = [IntPtr]0xffff $WM_SETTINGCHANGE = 0x1A $result = [UIntPtr]::Zero [Win32Notify]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref]$result) | Out-Null }
注意:该方式依赖服务器2的计算机账户对目标DFS路径有访问权限,执行后若当前已登录远程桌面,重启explorer.exe进程即可看到映射,无需重启服务器。
方案2:仅为指定管理员账户创建交互式登录可见的持久化映射
如果只需要给指定域账户创建映射,需要先调整远程会话配置,再创建映射:
- 一次性配置远程服务器的会话规则(仅需执行一次)
Invoke-Command -ComputerName $SecondaryServer -ScriptBlock { # 关闭管理员账户远程登录的UAC令牌过滤 New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "LocalAccountTokenFilterPolicy" -Value 1 -PropertyType DWord -Force # 注册自定义PSSession配置,强制加载用户完整配置文件 Register-PSSessionConfiguration -Name Demo -RunAsCredential 'abc.local\Administrator' -Force }
- 远程创建全局作用域的持久化映射
$adminCred = Get-Credential 'abc.local\Administrator' Invoke-Command -ComputerName $SecondaryServer -ConfigurationName Demo -ScriptBlock { param($cred) # 清理可能存在的冲突映射 Remove-PSDrive -Name T -Force -ErrorAction SilentlyContinue # 创建全局作用域的持久化映射 New-PSDrive -Persist -Name "T" -PSProvider "FileSystem" -Root "\\abc.local\Demo1" -Scope Global -Credential $cred -ErrorAction Stop } -ArgumentList $adminCred
执行完成后注销服务器2上的当前登录会话,重新登录即可在资源管理器看到T盘映射。
避坑说明
- 不带
-Scope Global参数的New-PSDrive -Persist在远程会话中创建的映射仅在当前临时PSSession生命周期内有效,会话关闭后自动删除。 - 已经打开的交互式桌面会话不会自动同步新创建的用户级映射,必须注销重登或重启资源管理器才能看到。
内容的提问来源于stack exchange,提问作者Shritej Murmadkar
相关产品推荐
相关产品推荐

