プログラムがクライアントマシンにインストールされたら、Windows 7でプログラムを管理者として実行するにはどうすればよいですか?
プログラムがクライアントマシンにインストールされたら、Windows 7でプログラムを管理者として実行するにはどうすればよいですか?
回答:
プログラムに埋め込まれるマニフェストを変更する必要があります。これはVisual Studio 2008以降で機能します。プロジェクト+新しい項目の追加、「アプリケーションマニフェストファイル」を選択します。<requestedExecutionLevel>
要素を次のように変更します。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
ユーザーがプログラムを起動すると、UACプロンプトが表示されます。賢く使用してください。彼らの忍耐力はすぐに消耗します。
requestedExecutionLevel
マニフェストに要素を追加することは、戦いの半分にすぎません。UACをオフにできることを覚えておく必要があります。もしそうなら、ユーザーが管理者でない場合、古い方法でチェックを実行し、エラーダイアログを表示する必要があります(スレッドのを
呼び出しIsInRole(WindowsBuiltInRole.Administrator)
ますCurrentPrincipal
)。
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
ます
IsInRole
Andersが語るのMSDNの例を次に示します。
詳細な手順は次のとおりです。
このコードを使用して、ClickOnceのセキュリティ設定をオフにする必要があることに注意してください。これを行うには、[プロパティ]-> [セキュリティ]-> [ClickOnceセキュリティ]に移動します。
New Item...
私のインストーラーサービスプロジェクトのオプションではありません。アプリマニフェストを追加するにはどうすればよいですか?メインプロジェクトに追加できますが、インストーラーは追加できません。
私はそれを手動で行うためにいくつかのコードを実装しました:
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" />
アプリケーションを管理者として実行するように設定するには、中央のアプリケーションを選択する必要があります。
ごとに
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
アプリケーションマニフェストがない場合、または追加する方法がわからない場合は、アプリケーションマニフェストを追加することをお勧めします。一部のプロジェクトでは個別のマニフェストファイルが自動的に追加されないため、まずプロジェクトのプロパティに移動し、[ アプリケーション ]タブに移動して、タップの下部にあるプロジェクトがマニフェストを除外していないことを確認します。
Visual Studio 2010でプロジェクト名を右クリックします。「ウィンドウ設定の表示」をクリックすると、「app.manifest」というファイルが生成されて開きます。このファイル内のコメント付きセクションで説明されているように、このファイル内で「asInvoker」を「requireAdministrator」に置き換えます。
これを行う別の方法は、コードのみで、@ 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);
}
runas
管理者以外のユーザーから管理者として何かを起動するにはUACを有効にする必要があることに注意してください。そうしないと、現在のユーザー権限でサイレントに開きます(Windows 7 64ビットでチェックされます)。UACを無効にして管理者権限がない場合にできることは、適切な瞬間に実行を停止することです。
ClickOnceセキュリティ設定を使用してマニフェストを作成し、それを無効にすることができます。
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
クリックすると、プロジェクトのプロパティフォルダーの下にapp.manifestというファイルが作成されます。これが作成されると、Enable ClickOnce Security Settings
オプションをオフにすることができます
そのファイルを開き、次の行を変更します。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
に:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
これにより、プログラムには管理者権限が必要になります。
これは、上記の@NGによるこの回答の簡略版です。
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}
実行可能ファイルを右クリックし、[プロパティ]> [互換性]に移動して、[このプログラムを管理者として実行]チェックボックスをオンにします。
すべてのユーザーの管理者として実行する場合は、「すべてのユーザーの設定を変更する」で同じことを行います。