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方式发布

版权声明:本文为xiangxiong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiangxiong/p/6560513.html