由于我有 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 Shell)将使用受限令牌启动,即使在管理员帐户下也会产生权限降低的环境。当应用程序请求更高的权限或单击“以管理员身份运行”时,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 提升,如果没有,它们就会退出/失败......但是,这种情况正在变得越来越少。