web-dev-qa-db-ja.com

.NETアプリケーションを管理者として実行するにはどうすればよいですか。

自分のプログラムをクライアントマシンにインストールした後、Windows 7で自分のプログラムを管理者として実行させるにはどうすればよいですか?

802
Gold

プログラムに埋め込まれているマニフェストを修正したいと思うでしょう。これはVisual Studio 2008以降で動作します:プロジェクト+新規項目の追加、 "アプリケーションマニフェストファイル"の順<requestedExecutionLevel>要素を次のように変更します。

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

ユーザーがプログラムを起動すると、 _ uac _ プロンプトが表示されます。賢く使う。彼らの忍耐力はすぐに消耗します。

1050
Hans Passant

マニフェストにrequestedExecutionLevel要素を追加することは、戦いの半分に過ぎません。 _ uac _ は無効にできることを忘れないでください。もしそうなら、あなたは古い学校の方法でチェックを実行し、ユーザーが管理者でない場合はエラーダイアログを表示する必要があります。
(あなたのスレッドのCurrentPrincipal上で IsInRole(WindowsBuiltInRole.Administrator) を呼び出してください)。

148
Anders

手動で実行するためのコードをいくつか実装しました。

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;
}
55
NG.

詳細な手順は以下の通りです。

  1. ソリューションにアプリケーションマニフェストファイルを追加する
  2. アプリケーション設定を "app.manifest"に変更
  3. "requestedExecutionLevel"のタグをrequireAdministratorに更新します。

Adding file in Solution

Select Application Manifest File

Select Manifest option

Update Manifest file

このコードを使用するには、ClickOnceのセキュリティ設定を無効にする必要があります。これを行うには、[プロパティ] - > [セキュリティ] - > [ClickOnceセキュリティ]の中に移動します

54
Hassan Rahman

EXEファイルにマニフェストファイルを埋め込むことができます。これにより、Windows(7以降)は常に管理者としてプログラムを実行します。

詳細については、ステップ6:アプリケーションマニフェスト(UAC)の作成と埋め込み(MSDN)を参照してください。

42
David

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" />

アプリケーションを管理者として実行するように設定するには、中央のものを選択する必要があります。

19
Rashad Maqsood

に従って

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

アプリケーションマニフェストをまだ持っていない場合、または追加する方法がわからない場合は、アプリケーションマニフェストを追加します。プロジェクトによっては自動的に別のマニフェストファイルを追加しないので、最初にプロジェクトのプロパティに行き、 Application タブに移動して、プロジェクトがタップの下部にあるマニフェストを除外していないことを確認します。

  • 次に、プロジェクトを右クリック
  • 新しいアイテムを追加する
  • 最後に、Application Manifest Fileを見つけてクリックします。
13

Visual Studio 2010で、プロジェクト名を右クリックします。 "View Windows Settings"を押すと、 "app.manifest"というファイルを生成して開きます。ファイル内のコメント付きセクションで説明されているように、このファイル内で「asInvoker」を「requireAdministrator」に置き換えます。

12
Evolved

これを行うもう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);
}
9
TheLethalCoder

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" />

これにより、プログラムに管理者権限が必要になります。

7
Yochai Timmer

これは上の@NGによるthis answer の簡易版です。

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
7
Hakam Fostok