質問

保護されたパス(%PROGRAMFILES%など)で何らかの処理を行う必要があるこのアプリケーションがあり、%APPDATA%を使用する必要があることはわかっていますが、今のところ変更できません。 UACを別のプロジェクトに表示するために必要なすべてのものを分離しました。サンプルコードを次に示します。

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

class Class1
{
    static void Main(string[] args)
    {
        try
        {
            File.CreateText(Path.Combine(Application.StartupPath, "something.txt"));
        }
        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show(ex.Message, "UnauthorizedAccessException", MessageBoxButtons.OK, MessageBoxIcon.Error);

            if (args.Length == 0)
            {
                Process proc = new Process();
                proc.StartInfo.FileName = Application.ExecutablePath;
                proc.StartInfo.Arguments = "not again";
                proc.StartInfo.Verb = "runas";
                proc.Start();
            }
            else
            {
                MessageBox.Show("Exit to avoid loop.");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

したがって、メインプログラムからこの実行可能ファイルを呼び出します。不正なアクセスが原因で失敗した場合、UAC要求を表示して自動的に起動します。

私の質問:

1)DLLからUACの昇格を要求する方法が見つからなかったため、プロジェクトの出力をDLLからEXEに変換する必要がありました。それを行う簡単な方法はありますか?

2)また、一部のプログラムでは、プログラムのロゴなどが含まれた、パーソナライズされたUACメッセージが表示されることに気付きました。例を示します。

Ugly UAC

パーソナライズされたUAC

プログラムでそれを行うにはどうすればよいですか

3)昇格した特権で実行しているときにループに入ることを避けるために、別のUnauthorizedAccessExceptionを取得します。同じ目標を達成するために何をしますか?

これですべてです。お時間をいただきありがとうございます。

役に立ちましたか?

解決

1、DLLをホストしているプロセスの昇格モードを制御することはできません。 ターゲットフォルダーまたはレジストリへのアクセス許可を付与するインストールプロセスを制御できる場合は、インストールプロセス中

2 クライアントが信頼する認証局が発行した証明書でプログラムに署名します。ローカルの証明書ストア(コントロールパネル->インターネットオプション、コンテンツタブ、発行元)にアクセスして、共通の認証局を確認してください。

3 UnauthorizedAccessExceotionを取得したら、それをホスティングexeにスローするか、セキュリティの問題を示すエラー値を返します。 DLLの呼び出し元は、プログラムが既に昇格されているかどうかをユーザーに通知するセキュリティエラーダイアログを表示する(ドメインコントローラーによって許可されていない?)、または runasコマンドを使用して昇格モードでプロセスを再起動する

他のヒント

同じ問題がありました。約2日間のグーグルで、ニーズに合った唯一のソリューションを見つけました-管理者権限でアプリケーションを起動します。アプリケーションを起動し、管理者として実行されているかどうかを確認します。そうでない場合-管理者権限で再起動します。

    static void Main(string[] args)
    {
        if (NeedElevation(args) && Elevate(args))
        { // If elevastion succeeded then quit.
            return;
        }
        // your code here
    }

    public static bool Elevate(string[] args)
    {
        try
        {
            ProcessStartInfo info = Process.GetCurrentProcess().StartInfo;
            info.Verb = "runas";
            info.Arguments = NoElevateArgument;
            foreach (string arg in args)
            {
                info.Arguments += ' ' + arg;
            }
            info.FileName = Assembly.GetEntryAssembly().Location;

            Process process = new System.Diagnostics.Process();
            process.StartInfo = info;

            process.Start();
        }
        catch (Exception)
        {
            MessageBox.Show("You don't have administrative privileges thus the Automatic Application Updates cannot be started. But the rest of application is available as usually.",
                "Not enough user rights", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return false;
        }

        return true;
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top