文件存在于Windows资源管理器和记事本中,但在我的程序中无法访问

本文关键字:我的 程序 访问 Windows 资源管理器 文件 记事本 存在 | 更新日期: 2023-09-27 18:19:06

为什么会出现以下问题?

:

  • 确保IIS已安装
  • 使用admin执行"notepad %WINDIR%'System32'inetsrv'config'applicationHost.config"账户

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

  • 在admin帐户的上下文中执行以下代码:

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

实际结果: False

预期结果: True

文件存在于Windows资源管理器和记事本中,但在我的程序中无法访问

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

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

你也可以通过将System32改为systemative来解决这个问题,但是只有当你将应用程序作为32位应用程序时:

string filePath = @"%WINDIR%'sysnative'inetsrv'config'applicationHost.config";

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

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

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

我无法复制你的结果。当我从管理员命令行提示符运行此命令时,我得到exists = True

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

我正在运行Windows Server 2008, 64位。net 4.0。