Метод DirectoryInfo.GetFiles не возвращает файлы - PullRequest
0 голосов
/ 28 февраля 2012

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

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

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.Длина броска FileNotFoundException.

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

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

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

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

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

Настройка "Платформа Target "в Project х Build properties до Any CPU (от x86) заставила его работать.Установка его на x64 также работала, но я полагаю, что это что-то вроде безопасности.

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

2 голосов
/ 28 февраля 2012

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

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

Вы можете настроить уровень выполнения в файле App.config, напримерthis:

<?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>

Вы можете найти статью здесь: Как заставить приложение C # запускаться только как администратор в Windows

0 голосов
/ 27 мая 2014

Это не проблема с разрешениями, но на самом деле она связана с направлением 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 ().

...