2012-08-16 84 views
0

我对Inno Setup FileExists函数有困惑。使用网络/共享资源的奇怪Inno安装行为

这里的情况。我有三台联网的计算机,具有类似WORKGROUP名称的计算机。 1)视窗7 32位 2)的Windows 7 64位 3)的Window XP服务包3

1)和3)已经设置为具有读写股,购自服务器。 ShareExe和ShareData

有问题的Inno Setup会在ShareExe文件夹中创建可执行文件的快捷方式。它要求用户输入服务器的ComputerName,然后使用FileExists验证正确的输入。

在XP(3)机器上运行此安装程序并指定1)的计算机名称工作得很好,但是,在Win7 64位PC上运行安装程序并指定与XP相同的ComputerName时,会导致FileExtsts测试失败。

奇怪的是,我可以去网上邻居并打开ShareExe文件夹并成功运行可执行文件。我的问题是,“为什么Inno FileExists仅在Win 7 64位机器上失败?”在参考资料中找不到任何与FileExists有任何版本差异的内容。 (我也尝试过使用相同的结果FileSearch)。

TIA

回答

1

在Windows 7(和Vista)与UAC启用,由管理员与非管理员上下文之间没有共享默认网络凭据和驱动器映射,即使是相同的用户。

默认情况下,Inno提升为管理员权限(通过PrivilegesRequired=admin),因为大多数安装必须(且应该)由管理员用户每台计算机执行。但是,这意味着浏览桌面时提示或保存的任何凭据都无法使用。

当通过API直接访问文件(如使用FileExists)时,Windows通常会尝试使用与登录到PC时相同的用户名/密码以静默方式连接到服务器;如果这失败了,那么它只报告一个错误,因为它无法在那个时候提示替代凭证。所以,如果你可以确保两台PC上的登录细节是相同的,那么它应该可以工作。 (你通常在连接到域的计算机上获得这个免费的,但不是工作组。)

如果这是不可能的,那么你可以尝试的其他东西是通过shell对话框强制访问 - if FileExists失败,然后使用GetOpenFileName提示用户使用相同的初始路径在该文件夹中查找特定文件。我没有测试过这个,但我认为这应该会导致Windows显示证书提示,然后您应该可以继续。

(如果这是一个内部应用程序,那么另一个选项是禁用[通过安全策略设置]或UAC的完全分离,虽然后者不是一个好主意。当然,这不是一个好主意,对于一个普通版本的应用程序是可以忍受的,而且如果你无论如何解决这个问题的话,它就会更加干净。)

+0

谢谢你这个深思熟虑的答案。由于这个应用程序是普遍可用的,用户是非专业人士,我希望你的GetOpenFileName建议是一个很好的解决方案。不幸的是,浏览文件夹对话框不接受默认的文件夹参数(\\ {computername} \ ...),因此用户必须找到共享的根文件夹并导航到可执行文件,我认为这会阻挡大部分目标用户。有没有验证服务器计算机名称的方法? (提示用户输入)。 – 2012-08-17 16:32:37

+0

您需要使用文件浏览器,而不是文件夹浏览器。关于具体路径,我假定由于您只是提示计算机名称,所以您已经知道至少一个有趣文件的共享名称和路径。如果情况并非如此,那么还有其他一些方法来验证计算机名称,但是您应该选择类似于您的应用程序将如何使用它的东西 - 例如。如果你的应用程序连接到它作为数据库服务器,然后做同样的验证它。如果你的应用程序打开一个特定的端口套接字,然后做同样的事情。等等。 – Miral 2012-08-18 02:18:44