Файл существует в Windows Explorer и блокноте, но недоступен в моей программе - PullRequest
3 голосов
/ 31 декабря 2011

Почему возникает следующая проблема?

Сценарий :

  • Убедитесь, что IIS установлен
  • Выполнить "notepad %WINDIR%\System32\inetsrv\config\applicationHost.config" с использованием учетной записи администратора

Фактический результат : файл успешно открыт в блокноте

  • Выполните следующий код в контексте учетной записи администратора:

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

Фактический результат : Ложь

Ожидаемый результат : Правда

Ответы [ 3 ]

3 голосов
/ 01 января 2012

Проблема заключается в том, что при запуске 32-разрядного приложения в 64-разрядной ОС платформа .Net автоматически перенаправляет запрос с %WINDIR%\System32 на %WINDIR%\SysWOW64.

Если вы измените свой проект на 64-битный, это решит вашу проблему.

Вы также можете решить проблему, изменив System32 на sysnative , но только если вы оставите приложение как 32-битное приложение:

string filePath = @"%WINDIR%\sysnative\inetsrv\config\applicationHost.config";
2 голосов
/ 01 января 2012

Это может быть связано с перенаправлением файловой системы. AFAIK t происходит либо при несовпадении 32/64 бит, либо в случае процессов с низким уровнем привилегий (UAC).

Теперь я знаю способ отключения этого поведения с помощью управляемых API. Вам нужно использовать http://msdn.microsoft.com/en-us/library/windows/desktop/aa365743(v=vs.85).aspx и / или быть привилегированным процессом.

Если вы измените свой проект на 64-битный, это, вероятно, решит вашу проблему.

0 голосов
/ 01 января 2012

Я не могу воспроизвести ваш результат. Когда я запускаю это из командной строки администратора, я получаю 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.

...