2011-10-06 50 views
5

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

我已经尝试在代码中输入UNC路径(ForceDirectories('\\computername\share\test\folder')),并且工作正常。但是,ExpandUNCFileName('P:\')似乎不工作;它返回'P:\'。 在Windows XP上,ExpandUNCFileName('P:\')返回UNC路径。

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

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

+0

这是由任何一个服务?你描述的行为与Delphi没有任何关系,因为没有为该过程设置驱动器映射。 –

+0

确认您已将驱动器号映射到共享。只有驱动器号未映射时,我才能重现您的问题(Delphi 7,2007 XE)。 – crefird

+0

这不是一个服务,它是一个VCL Forms应用程序。 – MGH

回答

10

根据Microsoft KB Article,如果启用了用户帐户控制,并且如果您从Windows资源管理器映射网络驱动器(未升级),则升级的程序将无法访问该驱动器。 Quote:

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

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

既然你在评论中提到你运行Delphi“作为管理员”(提升),这是你的问题。

解决方案:

  1. 不要运行德尔福升高,如果你不需要。如果您的软件需要提升,请将其分为两部分(提升和非提升),并从第一部分访问映射网络驱动器。然后使用提升的COM对象访问另一部分,或者只需执行一个单独的可执行文件。

  2. 地图从提升网络提示网络驱动器,以便映射的网络驱动器将提供给提升的用户:

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

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

+2

如果您选择第二种解决方案,如果您平常需要它,您需要再次从常规用户(无需提升)映射它。 – Whiler

相关问题