來自 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
這是因為它們是不同的、簡單的。聯合應用中心可以已經實施了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 提升,如果沒有,則退出/失敗......但是,這種情況正在變得少得多。