web-dev-qa-db-ja.com

WPFアプリケーションを管理者モードで実行する方法

Windowsサービス、ローカルマシンのタスクスケジューラにアクセスするWPFアプリケーションがあります。このWPFアプリケーションを展開し、「管理者として実行」せずに実行すると、ローカルマシン上のWindowsサービスとタスクスケジューラーにアクセスできないため失敗します。 「管理者として実行」で実行すると、正常に動作します。

本番環境にデプロイされたアプリケーションをデフォルトで管理モードで実行するにはどうすればよいですか?

47
SVI

app.manifestを追加する必要があります。 requestedExecutionLevelasInvokerからrequireAdministratorに変更します。ファイルの追加ダイアログを使用して新しいマニフェストを作成し、それを変更して管理者を要求できます。プロジェクト設定がそのマニフェストも使用するように設定されていることを確認してください。これにより、アプリケーションをダブルクリックするだけで、まだ昇格していない場合は自動的に昇格を求められます。

その他のドキュメントについては、こちらをご覧ください:

http://msdn.Microsoft.com/en-us/library/bb756929.aspx

編集:価値のあることについては、この記事ではVS 2005を使用し、mt.exeを使用してマニフェストを埋め込みます。 Visual Studio 2008+を使用している場合、これは組み込みです。プロジェクトのプロパティを開くだけで、[アプリケーション]タブでマニフェストを選択できます。

75
vcsjones
  1. WPFプロジェクトを右クリックして、新しいアイテムを追加します:「追加->新しいアイテム...」
  2. [アプリケーションマニフェストファイル]を選択し、[追加]をクリックします
  3. 新しく作成したマニフェストファイルをダブルクリックし、変更します
    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

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

その後、WPFアプリケーションは管理者として実行されます。

5
SLdragon

Clickonceを壊したくない場合は、このコードが最適なソリューションです。

using System.Security.Principal;
using System.Management;
using System.Diagnostics;
using System.Reflection;
//Put this code in the main entry point for the application
// Check if user is NOT admin 
if (!IsRunningAsAdministrator())
{
    // Setting up start info of the new process of the same application
    ProcessStartInfo processStartInfo = new ProcessStartInfo(Assembly.GetEntryAssembly().CodeBase);

    // Using operating Shell and setting the ProcessStartInfo.Verb to “runas” will let it run as admin
    processStartInfo.UseShellExecute = true;
    processStartInfo.Verb = "runas";

    // Start the application as new process
    Process.Start(processStartInfo);

    // Shut down the current (old) process
    System.Windows.Forms.Application.Exit();
    }
}

/// <summary>
/// Function that check's if current user is in Aministrator role
/// </summary>
/// <returns></returns>
public static bool IsRunningAsAdministrator()
{
    // Get current Windows user
    WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();

    // Get current Windows user principal
    WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);

    // Return TRUE if user is in role "Administrator"
    return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
}

設立: http://matijabozicevic.com/blog/wpf-winforms-development/running-a-clickonce-application-as-administrator-also-for-windows-8

1
Mårshåll