5

ユーザーがコンピューター名を変更できるようにする必要があるC#アプリがあります。これはかなり特権的な操作です。ユーザーが管理者としてアプリを実行した場合にのみ機能させることができます(Windows 7、実行可能ファイルを右クリックして、[管理者として実行])。結構ですが、ユーザーは管理者なので、なぜ管理者として実行する必要があるのでしょう。私はこれを数回試しました。ユーザー(管理者)がアプリケーションを正常に実行しようとすると、常に失敗します。「管理者として実行」として実行すると、常に機能します。

答えが「そのように機能するので、管理者であっても管理者として実行する必要があります」の場合、私の質問は、彼らが超重複した管理者権限で実行されているかどうかをどのように検出できるかです。私はこれを見つけましが、ユーザーがAdministratorユーザーグループの一部であるかどうかを確認するだけです。これは、すでに指摘したように、十分ではありません(nullポインター例外をスローします)。

ここで何かが足りませんか?別の角度からアプローチする必要がありますか?

4

1 に答える 1

11

これは、ユーザーアカウント制御(UAC)が原因です。Vistaで導入されたこの機能により、管理者ユーザーアカウントの操作方法が変わります。

管理者グループのユーザーがログオンすると、ユーザーには2つのトークンが割り当てられます。1つはすべての特権を持つトークン、もう1つは特権が制限されたトークンです。そのユーザーが新しいプロセスを作成すると、そのプロセスにはデフォルトで減額された特権トークンが渡されます。したがって、ユーザーには管理者権限がありますが、デフォルトではそれらを行使しません。これは「GoodThing」™です。

これらの権限を行使するには、ユーザーは昇格された権限でプロセスを開始する必要があります。たとえば、「管理者として実行」動詞を使用します。彼女がこれを行うと、完全なトークンが新しいプロセスに渡され、すべての範囲の権利を行使できます。

プロセスが昇格して実行されているかどうかを検出したくないことはほぼ間違いありません。ベストプラクティスは、昇格が必要なプログラムの部分にマークを付け、プログラムのそれらの部分の実行時にシステムにUACの昇格ダイアログを表示させることです。

バインドは、昇格はプロセスの開始時にのみ発生する可能性があるということです。したがって、アプリを標高が必要な部分と必要のない部分に分割する必要がある場合は、複数のプロセスが必要です。アプリ全体を昇格が必要であるとマークすることはできますが、昇格が必要なのがコンピューター名を変更する非常にまれなシナリオだけである場合は、そうしないでください。

次のステップは、MSDNで詳細を確認することです。例えば:

于 2012-12-04T20:54:55.830 に答える