2

先日、実行するとUAC画面が表示され、管理者権限での実行を要求するアプリケーションに出くわしました。UAC画面で[はい]をクリックすると、アプリケーションが通常どおり実行されます。興味深いのは、[いいえ]をクリックすると、アプリケーションは終了する代わりに実行されますが、制限されたユーザーアカウントで実行されます(もちろん、機能は少なくなります)。

私の質問は、これを行うようにC#アプリケーションを構成するにはどうすればよいですか?アプリケーションに昇格された特権で実行するアプリケーションマニフェストを含めることができることは知っていますが、上記で説明した種類の動作を複製するにはどうすればよいですか?

4

2 に答える 2

1

別の昇格したアプリケーションでこれを行うには、「ランチャー」を使用できます (またはランチャーは「通常の」アプリです)。

3 つのアプリケーションが必要な場合は、次のような WinForms ランチャーを使用できます。

[STAThread]
static void Main()
{
    const int ERROR_CANCELLED = 1223;
    try
    {
        Process.Start("el.exe");
        // ran el in elevated node...
    }
    catch (Win32Exception ex)
    {
        if (ex.NativeErrorCode == ERROR_CANCELLED)
        {
            Process.Start("normal.exe");
        }
    }
}

2 つのアプリケーションを実行している場合は、次のようにすることができます。

[STAThread]
static void Main()
{
    const int ERROR_CANCELLED = 1223;
    try
    {
        Process.Start("el.exe");
        // ran el in elevated node...
    }
    catch (Win32Exception ex)
    {
        if (ex.NativeErrorCode == ERROR_CANCELLED)
        {
            // "continue" as un-elevated app.
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
于 2012-09-20T17:16:32.187 に答える
0

すべてのコードを1つのアプリケーションに保持できます。アプリケーションマニフェストは、アプリケーションを昇格して実行するように要求せず、asInvokerレベルを使用します。

アプリケーションが起動すると、昇格して自身を再起動しようとします。runasつまり、動詞で別のプロセスを開始します。成功した場合、最初のインスタンスが存在します。

昇格が成功しなかった場合は、機能が制限された状態で実行を継続します。


しかし、ユーザーエクスペリエンスについて考えてみてください。

世界中の誰もが管理者として働いているわけではありません。彼らにとって、昇格はクリックContinueボタンのようには見えません。UACは管理者のユーザー名とパスワードを提供するように求めます。

この観点から、Microsoftが推奨するアプローチはうまく機能します。本当に昇格する必要があるまで、通常のユーザーとして実行します。すべての標高ポイントは、UIで明確にマークする必要があります。同じexeファイルを使用して、昇格されていないインスタンスと昇格されたインスタンスを実行できますが、昇格されていないインスタンスがユーザーの要求する操作を実行するためのすべてのデータを提供できるように、通信メカニズムを実装する必要があります。昇格されたインスタンスを開始したら、それを実行し続け、昇格されていないインスタンスを終了できるため、昇格せずに他の操作を実行できます。

したがって、それはより多くの努力を意味しますが、はるかに優れたユーザーエクスペリエンスです。

于 2012-09-23T18:42:37.973 に答える