6

我在从我的 Delphi 程序写入 Windows 7 中的映射网络驱动器 (P:) 时遇到了一些问题。例如,当我尝试时ForceDirectories('P:\test\folder'),我得到一个错误(找不到路径)。

我曾尝试在代码 ( ForceDirectories('\\computername\share\test\folder')) 中输入 UNC 路径,这很有效。但是,ExpandUNCFileName('P:\')似乎不起作用;它返回'P:\'。在 Windows XP 上,ExpandUNCFileName('P:\')返回 UNC 路径。

如何在 Windows 7 上的 Delphi 中获取 UNC 路径,或者写入映射的网络驱动器?

经过进一步调查,好像我在 Windows 中缺少某种初始化。我有另一个使用TcxShellComboBox(DevExpress 组件)的应用程序(app2)。导航到 P: 在该组合框中,在 app2 中,调用以ExpandUNCFileName在第一个应用程序中正常工作。与FileExistsP: 下的文件相同,在 app2 中导航到 P: 之前返回 False,在计算机重新启动之后和直到计算机重新启动之前返回 true。

4

1 回答 1

12

根据Microsoft 知识库文章,如果启用了用户帐户控制,并且如果您从 Windows 资源管理器(非提升)映射网络驱动器,则提升的程序将无法访问该驱动器。引用:

如果用户登录到 Windows Vista 或 Windows 7,并且启用了用户帐户控制,则使用用户的过滤访问令牌的程序和使用用户的完整管理员访问令牌的程序可以同时运行。因为 LSA 在两个单独的登录会话期间创建了访问令牌,所以访问令牌包含单独的登录 ID。

映射网络共享时,它们会链接到当前进程访问令牌的当前登录会话。这意味着,如果用户使用命令提示符 (Cmd.exe) 和过滤的访问令牌来映射网络共享,则不会为使用完全管理员访问令牌运行的进程映射网络共享。

由于您在评论中提到您运行 Delphi“以管理员身份”(提升),这是您的问题。

解决方案:

  1. 如果不需要,请不要运行 Delphi 提升。如果您确实需要软件中的提升,请将其分成两部分(提升和非提升),并从第一部分访问映射的网络驱动器。然后使用提升的 COM 对象或简单地通过执行单独的可执行文件来访问另一部分。

  2. 从提升的网络提示映射网络驱动器,以便提升的用户可以使用映射的网络驱动器:

    一种。打开提升的命令提示符(以管理员身份运行“cmd.exe”)

    湾。类型net use p: \\computername\share\test\folder

于 2011-10-06T15:32:51.080 回答