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方式发布
时间: 2024-10-12 13:32:09