Windows 7 上的 VB6 应用程序无法访问映射驱动器
Posted
技术标签:
【中文标题】Windows 7 上的 VB6 应用程序无法访问映射驱动器【英文标题】:VB6 Application on Windows 7 Cannot Access Mapped Drives 【发布时间】:2012-02-07 10:21:31 【问题描述】:我有一个 VB6 应用程序,它从 Windows 7 32 位机器链接到多个 POS 终端。 POS 终端映射到 Windows 7 机器,我可以通过资源管理器或通过 cmdline/shell 从 Windows 7 机器访问 POS 终端。
应用程序已更新到 ADO 2.8,并且我不再拥有源代码的所有其他控件和组件都已重新编写。在经历了一些烦人的小插曲之后,我让应用程序在 Windows 7 计算机上重新编译,没有出现错误。
现在问题来了。 VB6 应用程序无法查看或导航到任何映射的驱动器!我试过玩弄 UAC 设置;我已将应用程序设置为在 Windows XP SP3 模式下运行;我试过以管理员身份运行。这些东西(以及这些东西的许多排列)都不起作用。
关于如何进行这项工作的任何建议?
【问题讨论】:
如何设置它以在 Windows XP SP3 模式下运行?当它不在该模式下运行时会发生什么? 您将其设置为以兼容模式运行,将其设置为使用 Windows XP SP3 作为兼容模式。这是通过右键单击链接并使用属性来完成的。在实践中,我使用这种兼容模式运行它并没有什么区别。 当您尝试导航到映射驱动器时会发生什么? UNC 路径呢? 在 VB6 应用程序中,例如驱动器列表,映射的驱动器未列出。尝试通过 ADO 访问 MS Access 数据库会导致找不到文件错误。没有尝试过使用 VB6 应用程序的 UNC 路径(在过去 5 年多的时间里,使用 VB6 的工作并不多……似乎记得不完整的 UNC 支持……但我可能是错的)。我从 VB 3 和 Win 3.11 开始使用 VB,但在过去 8 年中几乎只使用 VB.Net 当您谈论“导航”时,我假设您正在谈论文件打开对话框或类似的东西。如果这不是您正在使用的,请尝试使用从您的 VB6 应用程序打开的通用文件对话框映射驱动器和 UNC 路径。 【参考方案1】:添加此注册表设置为我解决了问题:http://technet.microsoft.com/en-us/library/ee844140%28v=ws.10%29.aspx。
要解决此问题,请配置 EnableLinkedConnections 注册表值。此值使 Windows Vista 和 Windows 7 能够 在过滤后的访问令牌和 管理员成员的完整管理员访问令牌 团体。配置此注册表值后,LSA 会检查是否 存在与当前用户关联的另一个访问令牌 如果网络资源映射到访问令牌,则为会话。如果 LSA 确定有链接的访问令牌,它添加网络 分享到链接的位置。配置 EnableLinkedConnections 注册表值
单击“开始”,在“开始程序和文件”框中键入 regedit,然后 然后按 ENTER。
找到并右键单击注册表子项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System。
指向新建,然后单击 DWORD 值。
键入 EnableLinkedConnections,然后按 ENTER。
右键单击 EnableLinkedConnections,然后单击修改。
在数值数据框中,键入 1,然后单击确定。
退出注册表编辑器,然后重新启动计算机。
【讨论】:
这对我有用,特别是通用 USB 安装程序pendrivelinux.com/universal-usb-installer-easy-as-1-2-3。【参考方案2】:我相信您遇到了麻烦,因为临时驱动器映射是每个用户的,并且在 UAC 系统管理员组用户有两个单独的上下文(每个令牌一个:SU 和提升)。
有系统级驱动器映射之类的东西,它是在系统用户 (NT Authority\System) 下完成的。当您在此帐户下映射驱动器并对其进行持久映射时,所有用户都可以查看和使用该映射(受制于那里文件的通常访问权限)。
您执行此操作的正常方式是通过域级 GPO(组策略对象),这意味着如果在公司管理的 LAN 环境中贿赂您的本地盒子骑师。
在工作组计算机中执行此操作的一种方法是通过 AT 命令从提升命令提示符将字母映射为系统:
at 8:53 am "net use m: \\MediaShare\MyLibrary
ThePW /user:MediaShare\TheUser /persistent:yes > nul"
那里的远程服务器是 MediaShare,用户 TheUser,密码 ThePW,早上 8:53 是未来一两分钟,以避免意外安排明天。
但是由于 Session 0 Isolation,这在 Vista 和更高版本上失败了!
所以...在Run CMD.exe as Local System Account 使用第三个替代方案,这与ForcePush 对How to map a network drive to be used by a service 的回复中提到的相同。
我相信这就是你想要的。
【讨论】:
感谢您的意见。在这种情况下,驱动器映射最初由登录用户建立为本地映射。我认为这可能是导致问题的原因,然后让网络支持人员设置用户来配置映射,以便按照您的建议或通过登录脚本由 GPO 设置。无论哪种情况,结果都是一样的。登录用户可以查看和导航到映射的驱动器,并且可以使用资源管理器或通过命令行访问所有文件。但是,VB6 应用程序在运行时既不能“看到”也不能访问共享。 一般登录脚本只为未提升的用户登录设置映射。 VB6 程序使用什么凭据运行?同一个用户?高级用户?其他用户? 应用程序使用登录用户的凭据运行。从应用程序的角度来看,这就是所需的全部内容。 我不知道该告诉你什么。我只是尝试将共享映射到 Z:作为标准用户,然后运行 VB6 程序,它对 Z 没有问题:使用 Dir$() 或 Open/Line Input#/Close,Windows 7 SP1,32 位。也许你有一些完全不同的问题。【参考方案3】:不知道你有没有想过这个,但对我来说是 ChDir 命令(即使上面有注册表修复)。
我的代码里有
ChDir "P:\Temp\VidCap\Cam1\" 'I almost never use ChDir
Open "list.txt" For Output As #1
并且所有的 VB6 内置文件命令看起来都是直截了当的,尽管有任何操作,没有错误,没有任何东西。我通过明确的路径解决了它,(在我的代码中它是在一个字符串中,但你可以明确地拥有它):
dd = "P:\Temp\VidCap\Cam1\"
Open dd & "list.txt" For Output As #1
按预期工作。
希望对你有帮助
H
【讨论】:
【参考方案4】:试试这个:
以管理员身份打开命令提示符,然后输入:
net use Z: \\IP Address\share /user:you passwd /persistent:Yes
根据需要更改“IP 地址”、“共享”名称以及您的用户名和密码。
本文的作者是 howtogeek (source)。
【讨论】:
【参考方案5】:我有同样的问题。尝试使用 Commondialog 方法访问 USB 和映射驱动器时,VB6 一直崩溃,即使驱动器和文件都可以通过资源管理器正常访问。问题是驱动器未设置为共享。
通过在资源管理器中选择连接的USB驱动器然后右键单击解决
-
选择属性。
选择共享选项卡
选择高级共享
根据需要设置共享和用户权限。可能需要拥有本地管理员权限。
【讨论】:
以上是关于Windows 7 上的 VB6 应用程序无法访问映射驱动器的主要内容,如果未能解决你的问题,请参考以下文章
致命:无法访问“H:\/.config/git/config”:参数无效 [Windows 7 上的 Git]
VB6 IDE 是不是在 Windows 7 / 8 / 10 64 位上运行?