web-dev-qa-db-ja.com

アプリケーションにUACを昇格させる

UACの昇格が必要なアプリケーションがあります。

私はそれを与えることができるコードを持っていますが、アプリケーションが2回開きます..これが問題です..

これがForm1のコードです。

 public Form1()
    {
        InitializeComponent();

        WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
        bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);           

        if (!hasAdministrativeRight)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = Environment.CurrentDirectory;
            startInfo.FileName = Application.ExecutablePath;
            startInfo.Verb = "runas";
            try
            {
                Process p = Process.Start(startInfo);
            }
            catch (System.ComponentModel.Win32Exception ex)
            {
                return;
            }

        }

    }

これはコードprograms.csです

       static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

デバッグ時に、最初に実行されることがわかりました

プロセスp = Process.Start(startInfo);

これにより、アプリケーションのUAC昇格ダイアログが開き、アプリケーションが開きます

しかし、それはに行きます

Application.Run(new Form1());

main()で、アプリケーションを再度開きます。

私はそれが再びアプリを開くことを望まない...

私はこれに不慣れです。私が間違っていることはありますか。UACが開いたら閉じる必要がありますか。

ありがとう

12
user175084

アプリケーションが常に昇格された特権で実行されるようにするために、これらすべてに干渉する必要はありません。単純に アプリケーションマニフェストを追加 これにより、Windowsにアプリを昇格して実行するように指示でき、コードを1行も記述しなくてもUACプロンプトが表示されます。

ここにマニフェストを追加する方法も説明する回答付きの関連する質問があります: VS2008を使用してアプリケーションマニフェストをアプリケーションに埋め込むにはどうすればよいですか?

29
Jon

特権を上げると、常に新しいプロセスが開始されます。そもそも、管理者権限を要求するようにアプリケーションを設定することにより、昇格された権限から始める以外に、それを回避する方法はありません。実行できるアプリケーションは1つだけになるように、昇格されたプロセスが開始した直後にアプリケーションを終了することができます。

このシナリオは、機能の特定の部分のみを昇格する必要があるアプリケーション(Program Filesへのアクセスを必要とする自動自己更新インストーラーなど)に使用でき、常に管理アクセスを必要とするアプリケーションには使用できません。

3
J. Steen

This は、アプリケーションが最初から管理者権限を必要とすることがわかっている場合に、はるかに優れたアプローチです。

3
Bueller

以下の例のように、WindowsPrincipalコードをフォームからProgram.csに移動します。これにより、フォームを起動する前にユーザーにUAC権限の入力を求め、UAC権限が付与されている場合にのみフォームを起動します。

        static void Main()
        {
            WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);

            if (!hasAdministrativeRight)
            {
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                startInfo.Verb = "runas";
                try
                {
                    Process p = Process.Start(startInfo);
                    Application.Exit();
                }
                catch (System.ComponentModel.Win32Exception ex)
                {
                    MessageBox.Show("This utility requires elevated priviledges to complete correctly.", "Error: UAC Authorisation Required", MessageBoxButtons.OK);
//                    Debug.Print(ex.Message);
                    return;
                }
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
2
Martyn Talbot

現在のプロセスの特権レベルを確認する方法と、同意UIに明示的に同意してプロセスを自己昇格させる方法を示す、Microsoftの例があります。

AC自己標高(CSUACSelfElevation)

0