2012-02-28 3 views
0

Я пытаюсь вернуть файлы .config, которые существуют в %WINDIR%\System32\inetsrv\config.Метод DirectoryInfo.GetFiles не возвращает файлы

Для этого я использую следующий код:

DirectoryInfo configFolder = new DirectoryInfo(Environment.ExpandEnvironmentVariables("%WINDIR%") + @"\System32\inetsrv\"); 
FileInfo[] configFiles = configFolder.GetFiles("*.config"); 

Это возвращает ноль объекты в configFiles. Если я использую другую папку (скажем, D: \ DropBox), это нормально!

Этот код работал, что-то изменилось ??

Также FileInfo fi = new FileInfo(Path.Combine(configPath, "applicationHost.config")); возвращается в норме, но fi.Length выбрасывает FileNotFoundException.

Кажется, что это должны быть разрешения, но я не вижу, как проверить, есть ли у меня разрешения при запуске кода!

+3

Разрешения, возможно? Используемый контекст безопасности, возможно, не имеет доступа для чтения к этому местоположению и видит 0 файлов. – SpaceBison

+1

Вы используете это в 64-битной среде? Если да, то что произойдет, если вы измените System32 на SysWOW64? –

+0

@AndreLoker, который не имеет значения ...Я нахожусь на x64, хотя – neildeadman

ответ

2

Поскольку я не разработчик, и я только балуюсь с код (в основном для написания инструментов администрирования для себя), интересно, может ли кто-нибудь объяснить или указать мне правильное местоположение для ответа?

В принципе, у меня был код из чужого проекта, который работал, и скопировал его в мой собственный проект. Я уверен, что он работал раньше, но не может быть на 100% уверен. В то время я запускал x86 Windows, но теперь я нахожусь на x64.

Старый код все еще работал, поэтому я просмотрел настройки и в итоге нашел решение.

Установка «Платформа цели» в ProjectBuild properties до Any CPU (с x86) заставляла работать. Установка его на x64 также работала, но я считаю, что это определенная вещь безопасности.

В любом случае проблема решена! Спасибо за все ваши предложения!

+0

Работал для меня. Благодаря! –

2

Вам нужно будет запустить код с повышенными привилегиями, потому что вы пытаетесь получить доступ к папке системы.

Если вы проверите его с помощью Проводника Windows -> Свойства -> Безопасность, вы обнаружите, что эта папка ограничивает доступ к SYSTEM, Администраторам и TrustedInstaller (не знаю, откуда приходит последнее), также может быть только на моя машина ...).

Вы можете настроить уровень выполнения в пределах вашего App.config файла, как это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <security> 
      <requestedPrivileges> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

Вы можете найти статью здесь: How To Force C# Application To Only Run As Administrator In Windows

+0

Я добавил это в свой app.config, и в качестве статьи, с которой вы связались, написано файл манифеста. Ничего не сработало. Я сменил папку на 'C: \ Windows \ System32 \', и он работает ...: S – neildeadman

0

Это не проблема с разрешениями, но на самом деле связана с направлением SysWow64, которое происходит за кулисами. C: \ windows \ system32 неявно перенаправляется на C: \ windows \ syswow64. Вот почему изменение архитектуры сборки устраняет проблему. Альтернатива, которая работает с любой архитектурой сборки, чтобы отключить переадресацию:

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); 

IntPtr ptr = new IntPtr(); 
Wow64DisableWow64FsRedirection(ref ptr); 

Обратите внимание, что это настройка для каждого потока, поэтому он должен быть запущен в правильном потоке, прежде чем использовать GetFiles().

+0

Это звучит интересно ... Прошло некоторое время с тех пор, как я задал вопрос, но я попытаюсь выкопать старый код и посмотреть, действительно ли это проблема, независимо от архитектуры ... Спасибо! – neildeadman

Смежные вопросы