Имея опыт работы с Linux/Unix, я не могу понять, как работает UAC в Windows.
Я слышал, что UAC работает как sudo
. Мое приложение Linux может выполнять какую-то другую работу перед вызовом sudo
.
Но в Windows, похоже, что все приложения, которым требуется подтверждение UAC, должны получить разрешение UAC, прежде чем выполнять какую-либо фактическую работу! Я запускаю приложение, оно запрашивает у меня подтверждение UAC, и я отказываюсь — приложение просто не запускается.
Так работает ли UAC таким образом?
sudo su
./run_app
Скорее, чем:
./do_work1
sudo su
./du_work2
Спасибо всем за отличный ответ!
решение1
При входе в Windows в качестве обычного пользователя создается сеанс входа и назначается токен, содержащий только самые основные привилегии. Таким образом, новый сеанс входа не может вносить изменения, которые могли бы повлиять на всю систему. При входе в качестве пользователя из группы «Администраторы» назначаются два отдельных токена. Первый токен содержит все привилегии, обычно предоставляемые администратору, а второй — ограниченный токен, аналогичный тому, что получил бы обычный пользователь. Затем пользовательские приложения, включая оболочку Windows, запускаются с ограниченным токеном, что приводит к среде с ограниченными привилегиями даже под учетной записью администратора. Когда приложение запрашивает более высокие привилегии или нажимается «Запуск от имени администратора», UAC запросит подтверждение и, если дано согласие, запустит процесс с использованием неограниченного токена.
Насколько я понимаю, последнее предложение означает, что либо диалоговое окно UAC отображается до загрузки приложения, чтобы оно запускалось с неограниченным маркером, либо, если оно запускается с привилегиями обычного пользователя и для какой-то работы ему требуются повышенные привилегии, ему необходимо получить согласие пользователя, а затемпорождает новый процесс, который затем запускается с повышенными правами. Токен, назначаемый при запуске процесса, определяет его права. Этот токен нельзя изменить позже, поэтому, если требуются дополнительные права, необходимо создать новый процесс.
Таким образом, UAC — это не совсем то же самое, чтосудо.
решение2
В Windows запрос UAC срабатывает при попытке запустить исполняемый файл, которыйотмечено в манифесте как требующее повышениявстроено в файл, и вы еще не работаете с повышенными правами. Поведение больше похоже на setuid, чем на su, поскольку это файл, а не команда, сообщает ОС, что исполняемый файл должен быть запущен с другими учетными данными.
решение3
Потому что они разные, простые и понятные. UACмогбыли реализованы как sudo
, но это не так.
Это можно рассматривать как аналогию с сетевой защитой.
sudo
это как когда программа запрашивает сетевой доступ, а ваш брандмауэр предлагает вам предоставить его или нет. Вы можете сказать «да», и программа откроет сокет, или вы можете сказать «нет», и она пожалуется на отсутствие соединения и сделает все, что может, без сетевого доступа (некоторые плохо спроектированные программы на самом деле зависают). Например:
function1();
input();
function2();
secure_operation(); //requests access
function3(); //may depend on results of previous operation; error-checking important
UAC больше похож на предупреждение, которое вы получаете при попытке открыть файл, загруженный на том NTFS. Windows предупреждает вас о потенциальной опасности и спрашивает, хотите ли вы запустить его (вообще) или нет. Это операция типа «все или ничего»; вы не можете доверять только части программы и не доверять другим. Например:
if (requires_high_priv(program)) {
if (request_priv(program))
program();
}
else {
program();
}
Вы должны помнить, что в отличие от Linux, который больше ориентирован на продвинутых пользователей и приложения, Windows разработана так, чтобы быть удобной для максимально широкого круга пользователей, поэтому упрощение безопасности имеет первостепенное значение. Более того, из-за своей большой поверхности воздействия она часто становится целью для вредоносных программ, поэтому разумнее либо полностью доверять программе, либо не доверять ей вообще.
решение4
Я не очень хорошо знаю архитектуру Linux, поэтому простите, если я ошибся, но, насколько я понимаю, Linux и Windows в этом отношении не так уж и отличаются...
Пример... Скрипт копирования, который копирует обычный файл в незащищенное место и пытается скопировать файл в защищенное место, а затем снова выполняет обычное копирование.
Насколько я понимаю, в Linux приложение просто запускается и пытается выполнить действие — если у него нет разрешения на выполнение этого действия — оно не выполнит это действие, но продолжит работу. В примере выше — при запуске скрипта копирования в Linux от имени обычного пользователя он скопирует обычный файл, выдаст ошибку разрешения и скопирует второй файл — если запустить с sudo, он сделает все три копии.
Windows в этом отношении абсолютно то же самое - запуск скрипта от имени пользователя без прав администратора просто скопирует один, разрешит второй и скопирует следующий. С UAC он запустит все три.
Разница в том, что многие приложения Windows просто имеют настроенную конфигурацию, которая по умолчанию запрашивает повышение прав UAC и завершает работу/дает сбой, если оно не выполнено... но таких приложений становится все меньше.