【问题标题】:C# Application get runs Twice while running as an administrativeC# 应用程序在以管理方式运行时运行两次
【发布时间】:2016-05-14 07:19:35
【问题描述】:

我正在尝试以管理员身份从启动开始运行我的应用程序。为此,我编写了以下代码:

         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
         System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);

         if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
         {
            Application.Run(new HomePage());
         }
         else
         {
             System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
             startInfo.UseShellExecute = true;
             startInfo.WorkingDirectory = Environment.CurrentDirectory;
             startInfo.FileName = Application.ExecutablePath;

             startInfo.Verb = "runas";
             try
             {
                 System.Diagnostics.Process.Start(startInfo);
                 Application.Exit();

             }
             catch
             {
                 return;
             }
             Application.Exit();
         }
      Application.Run(new HomePage());

这是我的 program.cs 文件。问题是当我运行它时,它带有两个相同的应用程序。我尝试了很多方法,但都没有解决。

是否可以从一开始就以管理员身份运行我的应用程序而不会引发以管理身份运行的对话?

【问题讨论】:

    标签: c# winforms wcf


    【解决方案1】:

    您调用 application.run 两次(如果您是管理员,一次在 if 中,一次在 if/else 块之后),因此对于管理员来说它将运行两次。

    只需在 if/else 之后删除 application.run 或反转您的 if else 以说明 if 不是管理员(您当前在 else 中的内容),不要放置 else 并让应用程序在最后运行仅当您不是管理员时才会被击中

         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
         System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
         // If you're an administrator
         if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
         {
            // Then run the application (first time)
            Application.Run(new HomePage());
         }
         else
         {
             System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
             startInfo.UseShellExecute = true;
             startInfo.WorkingDirectory = Environment.CurrentDirectory;
             startInfo.FileName = Application.ExecutablePath;
    
             startInfo.Verb = "runas";
             try
             {
                 System.Diagnostics.Process.Start(startInfo);
                 Application.Exit();
    
             }
             catch
             {
                 return;
             }
             Application.Exit();
         }
       // you end up here after it ran as an admin, skipping the else and you tell it to run again, either remove that line or invert your condition
      Application.Run(new HomePage());
    

    【讨论】:

    • 我听从了你的建议。如果我删除 Application.Run(new HomePage());从底部开始,我得到一个程序,但我的后台工作人员不起作用。我也无法调试我的程序。你的第二个建议给了我同样的结果。
    • 我解决了。 startInfo.FileName = Application.ExecutablePath;此行执行并打开应用程序。提交并运行良好。
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多