Программа (c #) работает с повышенными правами, но не может получить доступ к некоторым файлам - PullRequest
3 голосов
/ 17 мая 2011

Мой код работает с повышенными правами, но ничего не видит / не выполняет c: \ windows \ system32 \ rstrui.exe (интерфейс точки восстановления системы).

Я дважды проверил, чтобы убедиться, что код действительно работал с повышенными правами (это так), и я протестировал с File.Exist () и Directory.GetFiles () и System.Diagnostics.Process.Start ();файл не найден, это то, что возвращается.

Программа действительно там, я действительно могу запустить ее, я могу скопировать / вставить путь к DOS и вывести его список, выполнить его (без скрытых пробелов и т. Д.).

Любые идеи?

РЕШЕНИЕ:

Тим (ниже) дал мне решение, вместо ссылки c: \ windows \ system32 ссылка c: \ windows \ sysnative.«Сиснатив» перенаправляется или нет.Я все еще немного озадачен вещами перенаправления x64.Дело в том, что следующие работы:

Environment.GetEnvironmentVariable ("windir") + @ "\ sysnative"

Спасибо, Тим!

1 Ответ

8 голосов
/ 17 мая 2011

Позвольте мне догадаться ... вы работаете как приложение x86 в 64-битной установке Windows? Я не уверен в причине, но эта тема предоставляет некоторую информацию. Если вы скомпилируете его для родной 64-битной (или Любой процессор, который я предполагаю) вместо x86, он найдет файл правильно.

Причиной этого является перенаправление системных папок, которое происходит в 64-битных ОС на приложениях, работающих под WOW64. Вы можете прочитать больше об этом здесь . Один особенно важный кусок этого поста рассказывает о том, как его обойти:

Приложения могут управлять WOW64 перенаправитель файловой системы, используя Wow64DisableWow64FsRedirection , Wow64EnableWow64FsRedirection и Wow64RevertWow64FsRedirection функции. Отключение файловой системы перенаправление влияет на весь файл операции, выполняемые вызывающим поток, поэтому он должен быть отключен только когда это необходимо для одного CreateFile позвоните и снова включите снова после того, как функция вернется. Отключение перенаправление файловой системы дольше периоды могут помешать 32-битным приложения от загрузки системных DLL, вызывая сбой приложений.

32-битные приложения могут получить доступ к собственный системный каталог подставляя% windir% \ Sysnative для % WINDIR% \ system32. WOW64 распознает Sysnative как специальный псевдоним, используемый для указать, что файловая система должна не перенаправлять доступ. это механизм гибкий и простой в использовании, поэтому рекомендуется механизм обхода файловой системы Перенаправление. Обратите внимание, что 64-разрядный приложения не могут использовать Sysnative псевдоним, так как это виртуальный каталог не настоящий.

Мне не удалось реализовать идею %windir%\Sysnative, но я надеюсь, что либо это сработает, либо вы сможете включить / отключить перенаправление.

...