1

他のアプリをループでインストールする winforms アプリがあります。これは Windows 7 の管理者アカウントでは適切に機能しますが、標準アカウントでは深刻な問題があります。"Program Files(x86)" フォルダーに書き込むには、アプリで昇格が必要です。

したがって、次のコードを使用して、winforms c# アプリで特定のメソッド (インストーラーを実行するメソッド) の昇格を要求しようとしています。

[System.Security.Permissions.PrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

エラーを受け取った後、上記の属性を持つメソッドを呼び出す前に、次のように記述する必要があることを Web から学びました。

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

私はこれを行いましたが、メソッドはまだ次のエラーをスローします:

プリンシパル許可の要求に失敗しました。

段階的なデバッグは SetPrincipalPolicy 行を渡しますが、Demand 属性を持つメソッドに到達すると、SetPrincipalPolicy が存在しなかったかのように、同じエラーをスローします。

Demand 属性を適切に設定するのに何か問題がありますか?

前もって感謝します。

LATER EDIT:ここで要求されているのは、アプリをサイレントインストールするときに昇格要求をトリガーするはずのコードです(ただし、機能しません):

 WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
        bool hasAdministrativeRight = principal.IsInRole(WindowsBuiltInRole.Administrator);
        if (!hasAdministrativeRight)
        {
            ProcessStartInfo psi = new ProcessStartInfo(file);
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.UseShellExecute = true;
            psi.Verb = "runas";

            //psi.CreateNoWindow = true;
            psi.Arguments = modifiers;
            try
            {
                using (Process process = Process.Start(psi))
                {
                    process.WaitForExit();
                    if (process.HasExited)
                        return process.ExitCode;
                }
            }
            catch (Win32Exception wex)
            {

            }
        }

私が必要としているのは、アプリが Windows 標準ユーザーで実行された場合、そのプロセスが管理者のユーザー名とパスワードを求めるダイアログを表示することです。上記のプログラムで開始されたプロセスのみを管理者として実行する必要があり、メイン アプリ自体は標準ユーザーのままにすることができます。

4

2 に答える 2

3

これは、UAC が機能する方法ではありません。これはプロセスベースであり、ユーザーは、新しいプロセスを開始したときに「マシンをいじらせてください」というプロンプトしか表示されません。プログラムには、「マシンをいじるにはユーザーの同意が必要です。Yes と言ってください」という適切な呪文が組み込まれています。あなたはこの答えで何をしますか。

メソッドベースにするという考えには死ね。プログラマーにとっては不合理ですが、ユーザーにとっては理にかなっています。ユーザーが勝ちます。

于 2011-08-13T22:01:53.050 に答える
2

アプリを常に管理者として実行するように強制することができます。これがあなたのやり方です。ただし、アプリの実行に管理者権限が必要であることはお勧めしません。

を起動しProcessてインストーラーを実行する場合は、ここで管理者としてプロセスを実行する方法を確認できます

Visual Studio が使用する 3 番目のオプションは、管理者特権が必要な場合にアプリを再起動するように求められ、管理者としてアプリを再起動してタスクを実行できるようにすることです。2 番目の方法のコードを使用してアプリを起動するだけです。

管理者として実行するように投稿したメソッドは、ユーザーが管理者であるかどうかを確認し、管理者としてプロセスを開始します。ユーザーに管理者権限がない場合、アプリは起動しません。より良い解決策は、常に管理者としてプロセスを実行することです。次に、ユーザーは、管理者が入力できるパスワードとユーザー名を含む UAC プロンプトを取得します。

public static int RunAsAdmin(string fileName)
{

        ProcessStartInfo psi = new ProcessStartInfo(fileName);
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.UseShellExecute = true;
        psi.Verb = "runas";
        psi.Arguments = modifiers;

        try
        {
            using (Process process = Process.Start(psi))
            {
                process.WaitForExit();
                if (process.HasExited)
                    return process.ExitCode;
            }
        }
        catch (Win32Exception wex)
        {

        }

    return 0;
}
于 2011-08-13T22:01:43.397 に答える