private void Form1_Load(object sender, EventArgs e) { if (WindowsIdentity.GetCurrent().Owner == WindowsIdentity.GetCurrent().User) // Check for Admin privileges { try { this.Visible = false; ProcessStartInfo info = new ProcessStartInfo(Application.ExecutablePath); // my own .exe info.UseShellExecute = true; info.Verb = "runas"; // invoke UAC prompt Process.Start(info); } catch (Win32Exception ex) { if (ex.NativeErrorCode == 1223) //The operation was canceled by the user. { MessageBox.Show("Why did you not selected Yes?"); Application.Exit(); } else throw new Exception("Something went wrong :-("); } Application.Exit(); } else { // MessageBox.Show("I have admin privileges :-)"); } }
if (!IsRunAsAdministrator()) { var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase); // The following properties run the new process as administrator processInfo.UseShellExecute = true; processInfo.Verb = "runas"; // Start the new process try { Process.Start(processInfo); } catch (Exception) { // The user did not allow the application to run as administrator MessageBox.Show("Sorry, this application must be run as Administrator."); } // Shut down the current process Application.Current.Shutdown(); } private bool IsRunAsAdministrator() { var wi = WindowsIdentity.GetCurrent(); var wp = new WindowsPrincipal(wi); return wp.IsInRole(WindowsBuiltInRole.Administrator); }
1)app.mainfest文件中
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
节点的值设置为 asInvoker
2)在App.cs中增加以下代码:
/// <summary>
/// 检查是否是管理员身份
/// </summary>
private void CheckAdministrator()
{
var wi = WindowsIdentity.GetCurrent();
var wp = new WindowsPrincipal(wi);
bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator);
if (!runAsAdmin)
{
// It is not possible to launch a ClickOnce app as administrator directly,
// so instead we launch the app as administrator in a new process.
var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);
// The following properties run the new process as administrator
processInfo.UseShellExecute = true;
processInfo.Verb = "runas";
// Start the new process
try
{
Process.Start(processInfo);
}
catch (Exception ex)
{
ex.WriteLog();
}
// Shut down the current process
Environment.Exit(0);
}
}
3)重写 OnStartup 函数
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
CheckAdministrator();
//如果不是管理员,程序会直接退出,并使用管理员身份重新运行。
StartupUri = new Uri("MainWindow.xaml", UriKind.RelativeOrAbsolute);
}
4)保存,重新生成,发布
加入上面的代码之后,重新使用ClickOnce方式发布