3

为什么会出现以下问题?

场景

  • 确保已安装 IIS
  • "notepad %WINDIR%\System32\inetsrv\config\applicationHost.config"使用管理员帐户执行

实际结果:文件在记事本中成功打开

  • 在管理员帐户的上下文中执行以下代码:

    string filePath = @"%WINDIR%\System32\inetsrv\config\applicationHost.config";
    Console.WriteLine(File.Exists(Environment.ExpandEnvironmentVariables(filePath)));
    

实际结果:假

预期结果:真

4

3 回答 3

3

问题是如果您在 64 位操作系统上运行 32 位应用程序,.Net 框架会自动将请求从 重定向%WINDIR%\System32%WINDIR%\SysWOW64.

如果您将项目更改为目标 64 位,这将解决您的问题。

您还可以通过将 System32 更改为sysnative来解决问题,但前提是您将应用程序保留为 32 位应用程序:

string filePath = @"%WINDIR%\sysnative\inetsrv\config\applicationHost.config";
于 2011-12-31T20:59:51.537 回答
2

这可能是由于文件系统重定向。AFAIK t 发生在 32/64 位不匹配或低权限 (UAC) 进程的情况下。

我现在知道使用托管 API 禁用该行为的方法。您需要使用http://msdn.microsoft.com/en-us/library/windows/desktop/aa365743(v=vs.85).aspx和/或成为高权限进程。

如果您将项目更改为面向 64 位,这可能会解决您的问题。

于 2011-12-31T20:28:52.573 回答
0

我无法重现您的结果。当我从管理员命令行提示符运行它时,我得到exists = True.

string s = @"%WINDIR%/System32\inetsrv\config\applicationHost.config";
bool exists = File.Exists(Environment.ExpandEnvironmentVariables(s));
Console.WriteLine("exists = {0}", exists);

我正在运行 64 位的 Windows Server 2008。.NET 4.0。

于 2011-12-31T20:04:51.210 回答