自分のプログラムをクライアントマシンにインストールした後、Windows 7で自分のプログラムを管理者として実行させるにはどうすればよいですか?
プログラムに埋め込まれているマニフェストを修正したいと思うでしょう。これはVisual Studio 2008以降で動作します:プロジェクト+新規項目の追加、 "アプリケーションマニフェストファイル"の順<requestedExecutionLevel>
要素を次のように変更します。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
ユーザーがプログラムを起動すると、 _ uac _ プロンプトが表示されます。賢く使う。彼らの忍耐力はすぐに消耗します。
マニフェストにrequestedExecutionLevel
要素を追加することは、戦いの半分に過ぎません。 _ uac _ は無効にできることを忘れないでください。もしそうなら、あなたは古い学校の方法でチェックを実行し、ユーザーが管理者でない場合はエラーダイアログを表示する必要があります。
(あなたのスレッドのCurrentPrincipal
上で IsInRole(WindowsBuiltInRole.Administrator)
を呼び出してください)。
手動で実行するためのコードをいくつか実装しました。
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" />
OR
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
OR
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
アプリケーションを管理者として実行するように設定するには、中央のものを選択する必要があります。
に従って
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
アプリケーションマニフェストをまだ持っていない場合、または追加する方法がわからない場合は、アプリケーションマニフェストを追加します。プロジェクトによっては自動的に別のマニフェストファイルを追加しないので、最初にプロジェクトのプロパティに行き、 Application タブに移動して、プロジェクトがタップの下部にあるマニフェストを除外していないことを確認します。
Visual Studio 2010で、プロジェクト名を右クリックします。 "View Windows Settings"を押すと、 "app.manifest"というファイルを生成して開きます。ファイル内のコメント付きセクションで説明されているように、このファイル内で「asInvoker」を「requireAdministrator」に置き換えます。
これを行うもう1つの方法は、コードのみで、 @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);
}
ClickOnceセキュリティ設定を使用してマニフェストを作成し、それを無効にすることができます。
Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings
それをクリックすると、 app.manifest という名前のプロジェクトのpropertiesフォルダーの下にファイルが作成されます。これが作成されたら、Enable ClickOnce Security Settings
オプションのチェックを外すことができます
そのファイルを開き、次の行を変更してください。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
に:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
これにより、プログラムに管理者権限が必要になります。
これは上の@NGによるthis answer の簡易版です。
public bool IsUserAdministrator()
{
try
{
WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
catch
{
return false;
}
}