WindowsでアプリのUACリクエストを拒否した場合、実行を継続しないのはなぜですか?


17

Linux / Unixのバックグラウンドから来て、WindowsでUACがどのように機能するか理解できません。

UACは次のように動作すると聞きましたsudo。私のLinuxアプリケーションは、を呼び出す前に他の作業を行うことができますsudo

しかし、Windowsでは、実際の作業を行う前に、UACの確認を必要とするすべてのアプリケーションでUACを許可する必要があります。私はアプリケーションを実行しますが、UACの確認を求められ、それを拒否します-アプリケーションは単に実行されません。

UACはこのように機能しますか?

sudo su
./run_app

のではなく:

./do_work1
sudo su
./du_work2

みんなのすばらしい答えをありがとう!

回答:


12

標準ユーザーとしてWindowsにログインすると、ログオンセッションが作成され、最も基本的な特権のみを含むトークンが割り当てられます。この方法では、新しいログオンセッションはシステム全体に影響を与える変更を加えることができません。Administratorsグループのユーザーとしてログインすると、2つの個別のトークンが割り当てられます。最初のトークンには、通常管理者に付与されるすべての特権が含まれ、2番目のトークンには、標準ユーザーが受け取るものと同様の制限付きトークンが含まれます。Windowsシェルを含むユーザーアプリケーションは、制限されたトークンで起動されるため、管理者アカウントでも特権環境が制限されます。アプリケーションがより高い特権を要求するか、「管理者として実行」をクリックすると、UACは確認を求め、同意が得られた場合、

私が理解することから、その最後の文が意味することは、アプリがロードされる前にUACダイアログが表示されて無制限のトークンで開始されるか、または標準ユーザー特権で開始され、一部の間に昇格された特権が必要な場合です動作するためには、ユーザーの同意を取得してから、新しいプロセスを生成して、昇格した権限で実行する必要があります。プロセスの開始時に割り当てられるトークンが、その権利を決定します。このトークンは後で変更できないため、さらに多くの権限が必要な場合は、新しいプロセスを作成する必要があります。

このように、UACはsudoとまったく同じではありません。


4
実際には、sudoと同じです。「sudo su」を実行しても、現在のシェルにルート権限は追加されず、別のプロセスで新しいシェルが開始されます。そのシェルを終了すると、最初のシェルに戻ります。
ワイザード

1
WindowsとUnixの違いは、Unixプログラマーがサブプロセスでの作業に慣れていることです。そのため、特権を必要とするタスクの特定の部分に対して、より特権のあるサブプロセスを開始するのは当然です。Windowsでは、すべてを1つのプロセスで行うのがより一般的であり、ジョブを別個の特権部分と非特権部分に分ける(別々のプロセスで実行する)のは、大変な作業のように見えます。(もちろん、多くの場合、仕事の途中ではなく、すぐに必要な特権を持っていないことを確認する方が良いでしょう!)
ハリージョンストン


4

それは、それらが異なっていて、単純で、単純だからです。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でコピースクリプトを実行する場合、通常のファイルをコピーし、権限の問題を与え、2番目のファイルをコピーします。sudoで実行すると、3つすべてのコピーを実行します。

この点に関して、Windowsはまったく同じです。非管理ユーザーとしてスクリプトを実行すると、1つがコピーされ、2つ目が許可発行され、次がコピーされます。UACを使用すると、3つすべてが実行されます。

違いは、多くのWindowsアプリケーションは、デフォルトでUACの昇格を要求し、それがない場合は終了/失敗するように設定されているだけであるということです。しかし、それはずっと少なくなっています。


1
...と、私は再読み込み私の答えとあなたの質問の後にあることを言わなければならない-私はあなたが求めているのかわから100%ではないよ...私はこのことができます願っていますが、ではなく、あまりにも確認してください:/
ウィリアムHilsum
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.