プログラムがクライアント マシンにインストールされたら、 Windows 7でプログラムを管理者として強制的に実行するにはどうすればよいですか?
13 に答える
プログラムに埋め込まれるマニフェストを変更する必要があります。これは、Visual Studio2008以降で機能します。[プロジェクト]+[新しいアイテムの追加]で、[アプリケーションマニフェストファイル]を選択します。<requestedExecutionLevel>
要素を次のように変更します。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
ユーザーは、プログラムを開始するとUACプロンプトを受け取ります。賢く使用してください。彼らの忍耐力はすぐに衰える可能性があります。
マニフェストに要素を追加することrequestedExecutionLevel
は、戦いの半分にすぎません。UACをオフにできることを覚えておく必要があります。そうである場合は、古い学校の方法でチェックを実行し、ユーザーが管理者でない場合はエラー ダイアログを表示する必要があります (スレッドの を
呼び出します)。IsInRole(WindowsBuiltInRole.Administrator)
CurrentPrincipal
手動で行うためにいくつかのコードを実装しました:
using System.Security.Principal;
public bool IsUserAdministrator()
{
bool isAdmin;
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch (UnauthorizedAccessException ex)
{
isAdmin = false;
}
catch (Exception ex)
{
isAdmin = false;
}
return isAdmin;
}
マニフェスト ファイルを EXE ファイルに埋め込むことができます。これにより、Windows (7 以降) は常に管理者としてプログラムを実行します。
詳細については、「ステップ 6: アプリケーション マニフェスト (UAC) を作成して埋め込む(MSDN)」を参照してください。
Visual Studio 2008 での作業中に、 を右クリックしてProject -> Add New Item
から を選択しApplication Manifest File
ます。
マニフェスト ファイルには タグrequestedExecutionLevel
があり、レベルを 3 つの値に設定できます。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
また
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
また
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
アプリケーションを管理者として実行するように設定するには、中間のものを選択する必要があります。
コードのみでこれを行う別の方法は、@NG による回答のように、プロセスが管理者として実行されているかどうかを検出することです。. 次に、アプリケーションを再度開き、現在のアプリケーションを閉じます。
このコードは、サービスとしてインストールする場合など、特定の条件下でアプリケーションを実行するときに管理者権限のみが必要な場合に使用します。したがって、他の回答でも強制されるように、常に管理者として実行する必要はありません。
以下のコードNeedsToRunAsAdmin
は、現在の状況で管理者権限が必要かどうかを検出する方法です。これが返された場合false
、コードは昇格しません。これは、他のアプローチに対するこのアプローチの大きな利点です。
このコードには上記の利点がありますが、新しいプロセスとして再起動する必要がありますが、これは必ずしも必要なものではありません。
private static void Main(string[] args)
{
if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Assembly.GetEntryAssembly().CodeBase;
foreach (string arg in args)
{
proc.Arguments += String.Format("\"{0}\" ", arg);
}
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch
{
Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
}
}
else
{
//Normal program logic...
}
}
private static bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
通り
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
アプリケーション マニフェストをまだ持っていない場合、または追加する方法がわからない場合は、アプリケーション マニフェストを追加する必要があります。一部のプロジェクトでは別のマニフェスト ファイルが自動的に追加されないため、まずプロジェクトのプロパティに移動し、 [アプリケーション] タブに移動して、プロジェクトがタップの下部にあるマニフェストを除外していないことを確認してください。
- 次にプロジェクトを右クリック
- 新しいアイテムを追加
- 最後に、[アプリケーション マニフェスト ファイル] を見つけてクリックします。
Visual Studio 2010 で、プロジェクト名を右クリックします。「View Windows Settings」をクリックすると、「app.manifest」というファイルが生成されて開きます。ファイル内のコメント セクションで説明されているように、このファイル内で「asInvoker」を「requireAdministrator」に置き換えます。
これは、アプリケーションが管理者として機能することを強制するものではありません。 これは、上記の @NG による this answer
の簡略版です。
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}