Откройте блокнот и перетащите в него текстовый файл с рабочего стола. Сработало? Теперь откройте блокнот от имени администратора и перетащите тот же файл. При включенном UAC у вас ничего не получится! Почему?
В обсуждении опроса про контроль учетных записей я уже объяснял, почему так происходит. Но мой комментарий был кратким и неглубоким. Недавно на форуме TechNet я принял участие в обсуждении аналогичной проблемы с архиватором, и оно побудило меня подробнее осветить вопрос в блоге. Сегодня я предлагаю вам первую часть своего рассказа, в котором речь пойдет об уровнях целостности (integrity levels) и обязательном контроле над ними в Windows.
Начиная с Windows Vista, все процессы и папки имеют определенный уровень целостности. Это позволяет дополнительно разграничивать доступ наряду со списками контроля доступа (ACL), которые настраиваются в свойствах папок и разделов реестра на вкладке «Безопасность».
Концепция уровней целостности — это довольно скучная техническая вещь, но я постараюсь рассказать о ней так, чтобы вам было интересно :)
Добро пожаловать в зрительный зал
Представьте, что все процессы в Windows занимают места в зрительном зале по ранжиру:
- в ложах сидят системные процессы, имеющие системный уровень целостности
- в первом ряду сидят процессы с высоким уровнем целостности, запущенные с полными правами администратора
- в партере рассаживаются процессы со средним уровнем целостности, запущенные с обычными правами
- на галерку загоняют процессы, запущенные с обычными правами, но низким уровнем целостности, например, Internet Explorer и часть процессов Google Chrome
Папки тоже имеют уровни целостности, и по умолчанию им присваивается средний уровень, за некоторыми исключениями, которые я покажу ниже.
В Windows даже администраторы работают с обычными правами, поэтому их процессы сидят в партере. Но администраторам выдается два билета на спектакль – обычный и полный (маркеры безопасности).
Когда администраторы хотят что-то рассмотреть получше, они идут в первый ряд. А контроль учетных записей – это распорядитель зала, который проверяет, есть ли у них туда билет.
Согласно купленным билетам (почти)
photo credit: victor_nuno
Изоляция привилегий пользовательского интерфейса (UIPI) построена так, чтобы процессы с более низким уровнем целостности не могли манипулировать процессами с более высоким уровнем. Однако эта модель не является непроходимой стеной по двум причинам.
- С галерки или из партера процесс может прочесть программку спектакля (данные), которую держит в руках процесс, сидящий в партере, т.е. имеет такие же права. Это сделано специально, иначе программам было бы затруднительно считывать данные, в том числе свои.
- Процессы все-таки сидят в одном зале (пользовательской сессии) и дышат одним воздухом (системной памятью). Поэтому хулиганствующий процесс из партера может запустить бутылкой в первый ряд (выполнить сложную атаку) и спровоцировать сидящий там процесс к серьезному нарушению общественного порядка (в системе).
Поэтому очень важна роль распорядителя зала, которую играет UAC, на чьи вопросы отвечаете именно вы!
Хотя контроль учетных записей напрямую не связан с уровнями целостности, их повышение зачастую происходит в результате повышения прав.
Экскурсия по зрительному залу
photo credit: melancholy rose
Я предлагаю вам прогуляться по зрительному залу, захватив с собой театральный бинокль для внимательного изучения подробностей интерьера, а также несколько модных аксессуаров от дизайнерских домов Sysinternals и Windows:
- Утилита Process Explorer покажет уровень целостности процессов в столбце Integrity Levels, который можно добавить из View – Select Columns – Process Image.
- Утилита PsExec умеет запускать процессы с низким уровнем целостности. В принципе, это может и Process Explorer, просто по ходу экскурсии я выполняю команды в консоли.
- Системная команда icacls умеет показывать уровень целостности папок и разделов реестра, поэтому сторонние средства нам не потребуются, хотя можно воспользоваться AccessChk от Sysinternals.
Я записал видео прогулки, а также подготовил текстовый рассказ о ней, дополненный скриншотами.
Из партера в первый ряд
Если вы сделали то, что я просил в самом начале статьи, то у вас открыто два окна блокнота – с обычными и полными правами.
Notepad с PID 6580 открыт с обычными правами и имеет средний уровень целостности, а Notepad с PID 408 запущен от имени администратора и имеет высокий уровень. Проводник, explorer.exe с PID 7196, запускается с обычными правами и средним уровнем.
Поэтому перетаскивание файла сработает только в блокнот с PID 6580, имеющий уровень целостности не выше, чем у проводника.
Я показал, что из партера в первый ряд попасть не удается, а заодно стало ясно, почему не сработало перетаскивание файлов в одном из двух случаев. Теперь давайте заберемся на галерку.
С галерки в партер
Программы хранят свои данные и настройки в папке %userprofile%\appdata в трех разных папках.
Здесь:
- Roaming — «легкая» папка. Если в организации профили перемещаемые, ее содержимое копируется на сервер.
- Local — «тяжелая» папка. Помимо прочего внутри нее, в папке Temp, хранятся ваши временные файлы. Поэтому ее содержимое на сервер не копируется, чтобы не задерживать процесс входа/выхода из системы.
- LocalLow — содержит данные, записанные с низким уровнем целостности, и сама она имеет такой же уровень.
С двумя последними папками мы и будем экспериментировать.
Запустите командную строку с обычными правами. Перейдите во временную папку, создайте в ней текстовый файл и попробуйте прочесть его.
:: Переход во временную папку cd %temp% :: Создание файла в папке echo integrity > il.txt :: Чтение созданного файла type il.txt
Работают чтение и запись, потому что командная строка и временная папка имеют одинаковые уровни целостности.
Теперь выполните в этой командной строке:
psexec -l -d cmd
Запустится новая командная строка с низким уровнем целостности. В ней будут выполняться все последующие команды. Можно также запустить командную строку в Process Explorer из меню File — Run as Limited User (при этом процесс запускается не только с ограниченными правами, но и с низким уровнем целостности).
Выполните в этой командной строке те же команды, что и ранее.
При попытке записи файла вы получите сообщение «Отказано в доступе». Это происходит потому, что временная папка Temp имеет средний уровень целостности, а командная строка запущена с низким уровнем. Однако прочесть созданный ранее файл можно.
Теперь перейдите в папку LocalLow, посмотрите ее уровень целостности и попробуйте записать файл – он будет успешно создан!
:: Переход в LocalLow cd ..\..\LocalLow :: Просмотр уровня целостности папки icacls . :: Создание файла в папке echo integrity > il.txt :: Чтение созданного файла type il.txt
Команда icacls показывает уровни целостности папок только в том случае, если они отличаются от стандартного, среднего уровня. У папки LocalLow он низкий, что и подчеркнуто на рисунке выше.
С реестром происходит примерно то же самое, где для низкого уровня целостности предусмотрен раздел HKEY_CURRENT_USER\Software\AppDataLow.
Как видите, процессы с низким уровнем целостности не могут перебраться с галерки в партер, но могут видеть, что там происходит. Эту модель могут использовать программы, и в папке LocalLow вы найдете их данные. Так, модель реализована в защищенном режиме Internet Explorer, песочнице Google Chrome и защищенном режиме Adobe Reader.
Как победить проблему
photo credit: AstridWestvang
Надеюсь, мне удалось объяснить, почему перетаскивание файлов не всегда работает при включенном UAC – все дело в волшебных пузырьках уровнях целостности. Как сделать так, чтобы оно работало всегда? Я думаю, что вы уже догадались!
Нужно запустить файловый менеджер с повышенными правами, от имени администратора, и перетаскивание будет работать нормально.
Впрочем, лучше делать это только при необходимости, иначе с полными правами будут работать все процессы, запускаемые из файлового менеджера.
С другой стороны, проблема в том, что для проводника не предусмотрен запуск с высоким уровнем целостности, в отличие, например, от Total Commander. Вы можете проверить это самостоятельно с помощью Process Explorer, либо посмотреть видео. А через неделю вы узнаете, почему так происходит с проводником и как обойти это ограничение. Гарантирую вам незабываемые впечатления от рассказа ;)
А в каких случаях вы пользуетесь перетаскиванием файлов? Сталкивались ли вы с тем, что невозможно перетащить файл из одной программы в другую?
jakv
Спасибо. Попробуем убедить.
jakv
С большим удовольствием почитал переписку Vadim Sterkin и artem.
И хотя все уже сказано хочу на всякий случай поделиться своими результатами
использования Virtual CD-ROM Control Panel в семерке. Для пояснения своих действии
приведу инструкцию из дистрибутива
1. Copy VCdRom.sys to your %systemroot%\system32\drivers folder.
2. Execute VCdControlTool.exe
3. Click «Driver control»
4. If the «Install Driver» button is available, click it. Navigate to the %systemroot%\system32\drivers folder, select VCdRom.sys, and click Open.
5. Click «Start»
6. Click OK
7. Click «Add Drive» to add a drive to the drive list. Ensure that the drive added is not a local drive. If it is, continue to click «Add Drive» until an unused drive letter is available.
8. Select an unused drive letter from the drive list and click «Mount».
9. Navigate to the image file, select it, and click «OK». UNC naming conventions should not be used, however mapped network drives should be OK.
Данную инструкцию я выполнил следующим образом:
пункты 1-6 выполнил в сеансе админа и завершил VCdControlTool.exe
пункты 7-9 выполнил запустив VCdControlTool.exe в режиме юзера
в результате получилась следующая картина:
в cmd от юзера виртуальный диск виден и с ним можно работать
в cmd от админа виртуальный диск не виден
в TC от юзера виртуальный диск виден и с ним можно работать
в проводнике (он естественно от юзера) виртуальный диск не виден и при вводе буквы диска в адресной строке говорит такого диска нет
в VCdControlTool.exe от админа виртуальный диск виден но в нем ничего не смонтировано
в VCdControlTool.exe от юзера виртуальный диск виден и в нем смонтирован образ
Для меня самая большая загадка почему в cmd от юзера виртуальный диск виден а в проводнике нет
Vadim Sterkin
jakv, я придерживаюсь принципа, что комментарии блога не предназначены для решения проблем читателей, особенно если они никак не связаны с темой записи. Предлагаю вам создать тему в форуме Windows 7 на OSZone и разбираться там.
jakv
Возвращаясь еще раз к тексту статьи
Вопрос почему в cmd от юзера виртуальный диск виден а в проводнике нет на мой взгляд напрямую связан с темой данной статьи
Но вам как автору конечно виднее
Читал я разные форумы по данной теме ответ как правило один «возьмите другую тулзу». А это ответ не на мой вопрос. Ну что ж попробую сделать попытку на OSZone
Tiunov Igor
Коллега обратил моё внимание на интересное поведение runas.exe связанное с UAC. Если я в скрипте запускаю «runas /user:admin cmd», где admin — локальный админ, то cmd запускается с низким уровнем. И, соответственно, ограничен в выполнении административных действий. Как быть в этом случае?
Vadim Sterkin
Tiunov Igor, на мой взгляд, такое поведение вполне ожидаемо. Ведь вы запускаете программу (в данном случае командную строку) от имени другого пользователя, а не с повышенными правами.
Тут есть терминологическая нестыковка. Runas — от имени (администратора, если выбрана его учетка), Run as Admin (в контекстном меню) — от имени администратора. Но это разные вещи.
Тот факт, что этот пользователь администратор, ничего не меняет. Войдите им в систему и запустите консоль — она откроется с обычными правами. Полные права будут лишь при запуске от имени администратора, как только вы одобрите запрос UAC.
Если вы хотите повысить права с помощью runas, вам надо использовать сторонние утилиты — nircmd, elevate, ele (см. следующую статью). После одобрения запроса UAC, консоль откроется от имени локального админа и с полными правами.
Sefko
Все очень интересно (относится не только к этой статье). Но!
«Уровень целостности» — уж очень неудачный термин. Хотя бы потому, что когда пишется в обсуждаемом контексте «уровень целостности ХХХ«, то речь вовсе не идет об уровне целостности этого самого ХХХ.
Подозреваю, что такое словоупотребление придумали не лично Вы. Но от этого оно никак не делается более удачным.
Vadim Sterkin
Sefko, я использую официальную терминологию, да и прямой перевод в даном случае ок.
Sefko
Vadim Sterkin!
А я ведь и написал, что подозреваю об официальности такого термина.. И мое сообщение — это вовсе никакой не упрек лично Вам. Но намек на то, что данный конкретный официальный термин очень неудачен.
Ваш ответ понял так, что Вы не склонны устраивать в своем блоге терминологические дискуссии. Прошу меня извинить за неуместный намек, отвлекающий от сути обсуждения.
Vadim Sterkin
Sefko, не вижу вашего варианта :)
Sefko
1. Если бы я сам считал какой-то вариант перевода правильным, то, разумеется, я бы его привел сразу же, а не ограничился намеком на не удачность принятого.
2. Google приводить такие варианты значений слова integrity:
целостность
неприкосновенность
честность
чистота
прямота
полнота
нетронутость
Жирным выделены значения, которые, на мой взгляд, ближе всего к сути обсуждаемых дел. Так вот, по совокупности, а так же учитывая контекст, мне кажется приемлемыми такие варианты перевода:
Integrity Mechanism ==> Система доверия;
Integrity level ==> Уровень доверия.
3. Хочу подчеркнуть: я вовсе не предлагаю свой вариант перевода — только привел тот, который, как мне кажется, лучше отражает суть дела.
Vadim Sterkin
Sefko, «доверие» — близко, ибо именно уровнем целостности определяется, что можно доверить процессу. Проблема в том, что термин «доверие» используется для перевода слова trust :) Поэтому я и говорю, текущий вариант — ОК.
Если вас интересует тема, см. также Поиск терминов — Майкрософт и следите за терминологическими форумами. Первую волну интерфейса Windows 8 уже обсуждали.
Sefko
Vadim Sterkin!
За наводку на ресурсы, где идет терминологическая дискуссия, спасибо!
Теперь ближе к теме.
Чисто эмоциональный, если можно так выразиться, вопрос: а как лично Вам кажется, то, что нельзя перетащить файл с рабочего стола в блокнот, запущенный с высоким уровнем чего-то там, — это у Microsoft удачно получилось? То есть не почему так получилось, а хорошо ли получилось?
Vadim Sterkin
Sefko, это, конечно, проблема юзабилити операционной системы.
Sefko
Vadim Sterkin!
Спасибо за ответ. Когда начинаешь разбираться в этих вещах, то на первых порах не очень понятно: проблемы настоящие, или это от непривычки. Мнение знающего человека здесь оказывает существенную помощь.В том числе и психологическую.
А проблема здесь еще и в том, что эти новшества от Microsoft понуждают массу людей, которые профессионально занимаются прикладным программированием, а не системным администрированием, лезть вообще-то в не свою сферу. А если на фирме не очень квалифицированные системные администраторы, то… туши свет, сливай воду, суши весла.
Еще раз спасибо.
Igor
Столкнулся с проблемой перетаскивания в фотошопе. Спасибо за доступное разъяснение.
ирина
впервые у вас в гостях. очень понравилось. работаю со студентами, на осень готовлю им сюрприз благодаря вашим материалам. спасибо
Vadim Sterkin
Ирина, а что, если студенты читают мой блог? :)
Nikolay
Вспоминаю известный анекдот, окончание:
— Ромашка.
— Ромашка!?- это два.
— Фамилия?
— Конопля
— О конопля!!! — это пять.
Сам часто прибегаю к аллегории, для объяснения того или иного.
НО у вас, конкретно этот пример, прошёл на отлично.
— Это пять.
Да и идеи с Шерлоком, очень хороши, жаль что вы их забросили. Тут как раз и сериал весьма популярный (хоть и короткий) идёт.
Николай
Вадим, как всегда, спасибо!
А чем задаются уровни целостности у папок? Той же командой icacls? Больно длинная у нее портняка параметров. :) А через GUI — никак?
Еще, если можно, вопрос почти по теме. Для чего дублируются переменные окружения TEMP и TMP: %USERPROFILE%\AppData\Local\Temp и %SystemRoot%\TEMP. Раньше всегда удалял пользовательские переменные TEMP и TMP чтобы чистить каталог TEMP было проще. Это неправильно?
Vadim Sterkin
Николай,
1.
icacls C:\folder /setintegritylevel high
2. Они не дублируются. Зачем разным пользователям иметь доступ к временным файлам друг друга? Как минимум, это нарушает конфиденциальность.
Николай
Ясно, спасибо.