【问题标题】:Detect drive letter not being used for mapping network share检测未用于映射网络共享的驱动器号
【发布时间】:2014-06-25 12:07:08
【问题描述】:

我正在编写一个作为 Windows 服务(Win XP、Vista、7、8、服务器)运行的 C++ 应用程序。
我的应用程序使用将本地文件夹映射到驱动器的第三方库,并且该驱动器应该在用户模式下可用(适用于所有用户)。当用户将某些网络共享映射到本地驱动器并且第三方库无法识别该指定的驱动器号已在使用时,就会出现此问题。
问题是如何确定(从服务应用程序)所需的驱动器号是否肯定可用?
我正在使用

GetLogicalDrives
QueryDosDevice

确定逻辑设备。我试过了

WNetGetConnection
WNetGetUniversalName

检索有关网络共享的信息,但这些函数不会返回所需驱动器号的任何内容,尽管存在映射到指定驱动器号的共享。
我的猜测是问题出在特权上。由于我的应用程序作为服务运行,它无法获取有关在用户模式下映射的共享的信息(这对我来说似乎很奇怪)。
那么最后一个问题是——如何检测指定的驱动器号是否未被任何用户用于映射网络共享?

【问题讨论】:

  • 您是否尝试过在该用户的上下文(登录身份)下运行的服务?
  • 我做了并且应用程序检测到使用 subst 映射的共享,但它没有检测到使用资源管理器的“映射网络驱动器”映射的共享

标签: c++ windows winapi windows-services network-share


【解决方案1】:

问题实际上在于,用户可以持有的份额和管理员可以持有的份额可能存在差异。

注册表中有一个标志可以控制这个:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

EnableLinkedConnections = 1 (DWord)

这里还有一个MSDN-KB article 解释了这一点。使用 EnableLinkedConnections 设置为 1 应该可以解决这个问题。通常设置为 1。

背景:当 UAC 被发明时,这种变化是一个副作用。

【讨论】:

  • 我将 EnableLinkedConnections 设置为 1,重新登录后没有任何变化。不过感谢您的文章。
  • 可能需要重启电脑。请记住,会话可能仍会拆分。所以有两个信息。一种用于用户模式,一种用于管理模式。如果在用户模式下添加映射会发生什么。它现在应该以管理员身份可见。如果您以管理员身份打开 cmd.exe 提示符并按 NET USE 会发生什么?
  • 嗯,它肯定需要重新启动。从管理员重新启动网络使用后,显示用户创建的共享(旧的和新创建的)。但是 WNetGetConnection 和 WNetGetUniversalName 都没有返回任何合适的东西。此外,使用 subst 安装的共享仍然不可见。无论如何,这种方法不是很好,因为它需要修改 UAC,这在客户端计算机上不太合适..
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2018-02-22
相关资源
最近更新 更多