Под UAC, почему я не могу написать файл от имени другого пользователя? - PullRequest
6 голосов
/ 25 апреля 2009

Я выдаю себя за пользователя до Windows 2008 с включенным UAC. Я пытаюсь записать некоторые файлы во временную директорию. Но даже если у пользователя есть права на запись в каталог, когда я имитирую этого пользователя, я не могу записать в этот каталог (я получаю ошибку «Отказано в доступе»). Видимо, это связано с тем, что UAC блокирует меня.

Это относится к сообщению на форуме Microsoft: http://forums.iis.net/t/1149793.aspx Но этот форум не получил ответа, кроме того, что сотрудник Microsoft постоянно задавал один и тот же вопрос и молчал, когда получил информацию, которую он запрашивал.

Мне удалось обойти это, не выдавая себя за себя во время записи во временный файл, но у меня есть несколько вопросов:

  1. Почему UAC не разрешает запись в файлы при олицетворении?

  2. Есть ли место, куда я могу помещать временные файлы, когда имитирую?

  3. Есть ли лучшее решение? Какой «правильный» способ справиться с этим?

  4. Есть ли источник документации для всех ограничений для пользователей UAC и олицетворенных пользователей?

Ответы [ 4 ]

3 голосов
/ 03 июля 2009

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

Windows поставляется со встроенным инструментом "cacls.exe", но я предлагаю chml из http://www.minasi.com/apps/, который облегчает их просмотр и редактирование. См. Также http://msdn.microsoft.com/en-us/library/bb625964.aspx для получения дополнительной информации.

1 голос
/ 29 августа 2010

Я думаю, что ответ NuSkooler, вероятно, правильный. В документации, на которую он ссылается (в частности, эта страница ), говорится следующее о корневой папке:

Устанавливая обязательную метку с высоким уровнем целостности, которая применяется к дочерним объектам, но не к дочерним контейнерам, безопасность по умолчанию для корневой папки соответствует этой политике. Обычные пользователи, запускающие программы со средним уровнем целостности, не могут изменять файлы, созданные администраторами в корневой папке, даже если ACL предоставляет пользователям возможность изменять права доступа. Корневая папка имеет наследуемую обязательную метку с высокой целостностью, которая является объектом наследовать, и это не распространяется на подпапки.

Я не знаю специфики вашей ситуации, но это похоже на то, с чем вы сталкиваетесь - невозможность записи в папку, даже если в ACL есть явная запись разрешения.

Вам следует попробовать использовать Process Explorer и Process Monitor, чтобы увидеть, что именно происходит, но это определенно звучит так, как будто это могут быть уровни целостности.

Кроме того, вы должны запускать icacls вместо просто cacls; это покажет вам уровни целостности в ACL.

1 голос
/ 25 апреля 2009

Полагаю, вы пишете во временный каталог, указанный в% TEMP% или через GetTempPath. Это переменная среды всего процесса, поэтому она не учитывает олицетворение. Быстрый способ проверить это - проверить путь, по которому вы пишете, чтобы убедиться, что он находится в профиле олицетворенного пользователя.

Следующий код должен быть в состоянии получить временный путь для олицетворенного пользователя.

// Error checking removed for brevity.
// User profile must be loaded by this point,
// see LoadUserProfile/UnloadUserProfile
SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, impersonationToken,
                SHGFP_TYPE_CURRENT,path);
StringCchCat(path, cchPath, "\Temp");
0 голосов
/ 27 августа 2010

Вы должны попробовать монитор процесса из msft. Этот инструмент должен дать вам больше информации о причине сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...