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