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


876

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


3
バイナリ心配性で(?あなたが求めているものということである)..あなたは、あなたが管理者権限を持っているかどうかをテストするいくつかのコードを書きたいかもしれませんが、書いたもの以外にも
lexu

39
私はこのタスクを軽くはしませんが、実際に管理者が必要とするものを確認し、それを回避できるかどうかを確認する必要があります。常に管理モードでアプリを実行して満足する顧客はいないでしょう。多くの大口顧客は、そのようなアプリを検討することすらありません。そして、ロゴテストがあなたにとって重要である場合、そのように合格しません。
アレックス

2
アレックスは非常に的を得ています。可能であれば、必要な場合にのみ昇格させてください。昇格しないと、グループポリシー、UAC、およびその他の多くの変数が機能します。少なくとも、UACでは、特定のユーザーアクションが実行されたときだけではなく、実行ごとにユーザーが承認する必要があります。
Anthony Mason

正しい方法は、アプリケーションにマニフェストファイルを埋め込むことです。
Elmue、

回答:


1145

プログラムに埋め込まれるマニフェストを変更する必要があります。これはVisual Studio 2008以降で機能します。プロジェクト+新しい項目の追加、「アプリケーションマニフェストファイル」を選択します。<requestedExecutionLevel>要素を次のように変更します。

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

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


33
コンパイルしようとしてClickOnceのエラーを取得した場合は、この回答を参照してください。stackoverflow.com/questions/11023998/...
SSS

17
アプリもアプリマニフェストを使用するように設定する必要があります。プロジェクトのプロパティで、[アプリケーション]タブを確認し、[リソース]の下の[マニフェスト]がapp.manifest(または。マニフェストファイル)
Victor Chelaru

7
VSが管理モードでの再起動を要求する前に、プロジェクトをリロードする必要がありました。
ジョン

3
@Alejandro-はい、UACを無効にできますが、UACを無効にするとユーザーが許可されている最高の権限ですべてが実行されるため、アプリが自動的に管理者として実行されます(ユーザーに管理者権限がある場合)。これは、ドアにファンシーロックを取り付けた場合、ドアが取り外されていると機能しないという不満のようなものです。
Erik Funkenbusch

4
@ErikFunkenbusch「管理者として自動的に実行」されません。ユーザーの通常の権限(ユーザーが管理者の場合は管理者、ユーザーが標準の場合は標準)で実行されます。その特定のケースに依存することは、たとえそれがデフォルトであっても、ペストのように優れたプログラムが回避するものです。あなたの類推に従って、派手なロックは素晴らしいですが、適切に設計されたソフトウェアは、たとえそれがまれにしか発生しない場合でも、ドア全体が取り外されるケースを予測する必要があります。
アレハンドロ

155

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


22
また、使用することもでき <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> ます
Mark Kram

18
@MarkKram:highestAvailableはこれとどのような関係がありますか?質問は管理者の強制に関するもので、highestAvailableはrequireAdministratorよりも制限が少なく、管理者以外のユーザーがUACプロンプトなしで昇格せずにアプリを起動でき、管理者のみがプロンプトを表示します...
アンダース

3
IsInRoleAndersが語るのMSDNの例を次に示します。
Uwe Keim

正確な詳細はもう覚えていませんが、これは障害者が何を意味するかによると思います。「UACスライダー」を一番下に配置することは、UACを無効にすることと同じではありません(Vistaを除く)。UACが完全に無効になっている場合、整合性レベルのメカニズム全体が無効になり、2000 / XPのクラシックrunas.exe機能のみが使用可能になります。adminロールチェックはrunas.exeケースを処理します。
アンデルス

1
サーバー2008 R2でEnableLUAを0に設定し、Administratorsグループから自分自身を削除して再起動すると、level = "requireAdministrator"を指定するexeがプロンプトなしで実行される
Tal Aloni

87

詳細な手順は次のとおりです。

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

ソリューションにファイルを追加する

アプリケーションマニフェストファイルを選択

マニフェストオプションを選択

マニフェストファイルを更新

このコードを使用して、ClickOnceのセキュリティ設定をオフにする必要があることに注意してください。これを行うには、[プロパティ]-> [セキュリティ]-> [ClickOnceセキュリティ]に移動します。


New Item...私のインストーラーサービスプロジェクトのオプションではありません。アプリマニフェストを追加するにはどうすればよいですか?メインプロジェクトに追加できますが、インストーラーは追加できません。
HackSlash

61

私はそれを手動で行うためにいくつかのコードを実装しました:

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;
}

45
これは、コンテキストが管理者として実行されているかどうかを検出するだけで、OPの要求どおりにアプリケーションを管理者として実行することを強制しません
Matt Wilko

5
アプリケーションに自分の権限を強制的に上げるプログラム的な方法はないと思います。あったとしても、それはかなりのセキュリティリスクでしょうね。
マークリッチマン2014

6
あなたの解決策は良いですが、質問は異なりましたが。;)
Yash

ここでは、このメソッドのリファクタリングバージョンを確認stackoverflow.com/a/50186997(主観)
ハカンFıstık

これは質問の答えにはなりません!
Elmue、


19

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

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


これは機能します。ただし、CMDアプリケーションの実行時に空のcmdウィンドウが表示されるようになりました(c#cmdアプリを使用してバックグラウンドでいくつかのexeを実行します)。
WM

13

ごとに

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

アプリケーションマニフェストがない場合、または追加する方法がわからない場合は、アプリケーションマニフェストを追加することをお勧めします。一部のプロジェクトでは個別のマニフェストファイルが自動的に追加されないため、まずプロジェクトのプロパティに移動し、[ アプリケーション ]タブに移動して、タップの下部にあるプロジェクトがマニフェストを除外していないことを確認します。

  • 次に、プロジェクトを右クリックします
  • 新しいアイテムを追加
  • 最後に、アプリケーションマニフェストファイルを見つけてクリックします。

12

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


6
この答えはVB.NETについてです:-)、一般的なVS 2010ではありません。「新しい項目の追加」の回答はC#に関するものです。C ++では、プロジェクト設定で行うことができます。
Philm 2013

12

これを行う別の方法は、コードのみで、@ 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);
}

1
コードのみのアプローチの場合は+1。runas管理者以外のユーザーから管理者として何かを起動するにはUACを有効にする必要があることに注意してください。そうしないと、現在のユーザー権限でサイレントに開きます(Windows 7 64ビットでチェックされます)。UACを無効にして管理者権限がない場合にできることは、適切な瞬間に実行を停止することです。
reallynice

9

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

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


7

これは、上記の@NGによるこの回答の簡略版です。

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

1
これは質問の答えにはなりません!
Elmue

@Elmue私がリファクタリングした元の回答にコメントを追加する方がより論理的です。私の回答へのリンクを見つけることができます。
HakanFıstık19年

-3

実行可能ファイルを右クリックし、[プロパティ]> [互換性]に移動して、[このプログラムを管理者として実行]チェックボックスをオンにします。

すべてのユーザーの管理者として実行する場合は、「すべてのユーザーの設定を変更する」で同じことを行います。


4
これは質問の答えにはなりません。「プログラムがクライアントマシンにインストールされたら」ではなく、「方法」ではありません。
Joe

わかりづらいです。プログラムがインストールされたら、実行可能ファイルのプロパティ(インストーラーではなくメインプログラム)でこの設定を変更します。彼は自分のプログラムを強制的に管理者として実行したいと考えています。
SlickJayD 2014年

2
マニフェストで管理要件を設定することをお勧めします。私はそれが質問に答えると主張しますが、かろうじてです。
BradleyDotNET 2014

3
@ジョー公平を期すために、アプリケーションのexeを再インストールする必要があるため、受け入れられた回答はOPの質問には回答しません。これは「プログラムがインストールされたら」の解決策にはなりません。この反対の回答が承認された回答よりも正しい場合、その回答が400票を超える理由を理解できません。
NickG 2014年

実際、両方の質問に完全に答えます。インストールされたマニフェストを変更する可能性はあまりありません。プログラムが実行されたら、そのアクセス許可を昇格させないでください。多くの環境では、マルウェアと呼ばれる良い方法です。ほとんどの企業では、ユーザーとその権限に負担をかけるため、この回答が最適です。本番環境に入ると「見る」ことも実行することもできないコードをたくさん書いています。自分のセキュリティ問題よりも賢くならないようにしてください。
jinzai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.