如果我在 PC 启动后立即查询驱动器,我会得到一个没有网络驱动器的列表:
PS C:\Users\thomas> get-psdrive
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
Alias Alias
C 211,64 32,50 FileSystem C:\ Users\thomas
Cert Certificate \
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
WSMan WSMan
稍后,当连接网络驱动器时,列表会更长(请注意 W:驱动器):
PS C:\Users\thomas> get-psdrive
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
Alias Alias
C 211,73 32,41 FileSystem C:\ Users\thomas
Cert Certificate \
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
W 61,51 279,95 FileSystem \\server\files
WSMan
该命令net use
列出了这些网络驱动器,即使未连接也是如此。Powershell 的等效版本是什么net use
?
我尝试在 Powershell ISE 中查找过滤器的函数get*net*
,get*drive*
但无法找到满足我需要的函数。
根据@MrPowerUser的建议,我尝试了
Get-WmiObject -Class win32_mappedlogicaldisk | select deviceid
和
Get-WmiObject -Query "Select * From Win32_LogicalDisk Where DriveType = 4"
但这只会导致连接的驱动器。我正在寻找未连接的驱动器。
答案1
这是 Windows 运行的结果。也就是说,这种行为是设计使然。
这些驱动器尚不存在,因为 Windows 尚未重新映射它们。它不会立即执行此操作,因为操作系统在登录实际完成之前就将控制权交给了用户。这是所需功能和可用性时间之间的权衡。您能做的最好的事情就是枚举驱动器HKEY_CURRENT_USER\Network
或HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
应该包括大多数网络映射驱动器的驱动器。但是,那些由组策略首选项映射或未持久映射的驱动器可能根本不存在于注册表中。
你可能可以通过以下方式防止这种行为使用组策略禁用快速登录优化强制 Windows 在登录时等待网络,或者强制“同步运行登录脚本”功能强制系统在启动 Explorer 之前运行所有脚本。我不确定第二个如何与 GP 首选项交互。但是,无论哪种方式都会有一些非常明显的副作用,例如登录速度较慢或如果您的计算机未连接到网络(例如,异地笔记本电脑),则可能无法登录。您在这里并没有加快任何速度。您只是强制延迟登录,以便在 Windows 允许用户执行任何操作之前完成更多操作。
如果您确实需要在登录时运行访问网络共享的脚本,则应使用 UNC 路径而不是网络驱动器。需要注意的是,大多数 PowerShell cmdlet 都支持 UNC 路径。
如果您需要验证映射驱动器是否存在,您只需等待。
Powershell 相当于什么
net use
?
Get-PSDrive
和New-PSDrive
。