Windowsサービス、ローカルマシンのタスクスケジューラにアクセスするWPFアプリケーションがあります。このWPFアプリケーションを展開し、「管理者として実行」せずに実行すると、ローカルマシン上のWindowsサービスとタスクスケジューラーにアクセスできないため失敗します。 「管理者として実行」で実行すると、正常に動作します。
本番環境にデプロイされたアプリケーションをデフォルトで管理モードで実行するにはどうすればよいですか?
app.manifest
を追加する必要があります。 requestedExecutionLevel
をasInvoker
からrequireAdministrator
に変更します。ファイルの追加ダイアログを使用して新しいマニフェストを作成し、それを変更して管理者を要求できます。プロジェクト設定がそのマニフェストも使用するように設定されていることを確認してください。これにより、アプリケーションをダブルクリックするだけで、まだ昇格していない場合は自動的に昇格を求められます。
その他のドキュメントについては、こちらをご覧ください:
http://msdn.Microsoft.com/en-us/library/bb756929.aspx
編集:価値のあることについては、この記事ではVS 2005を使用し、mt.exe
を使用してマニフェストを埋め込みます。 Visual Studio 2008+を使用している場合、これは組み込みです。プロジェクトのプロパティを開くだけで、[アプリケーション]タブでマニフェストを選択できます。
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
に
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
その後、WPFアプリケーションは管理者として実行されます。
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);
}