具有提升权限的应用程序加载缓慢

时间:2015-06-02 17:51:04

标签: c# wpf

我正在测试需要提升权限的C#WPF程序,如果我以管理员身份登录,则会毫不拖延地加载,但如果我以标准用户身份登录(99%的时间),那么会有延迟在UI出现之前大约30秒。

在C#控制台应用程序和c#Winforms应用程序中使用相同的高程代码,加载没有延迟,因此我知道代码有效。 那么,任何人都可以向我解释为什么会有与WPF相关的延迟;并且有解决方法吗?

以下是来自app.xaml.cs的代码(项目的其余部分由VS2010生成)

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using System.Security.Principal;
using System.Diagnostics;
using System.Reflection;
using System.ComponentModel;
using MyNewServiceLib;
using System.Runtime.InteropServices;

namespace WhySoSlow
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            if (!IsAdmin())
            {
                StartAsAdmin(e);
                Application.Current.Shutdown();
            }
            else
            {
                MainWindow = new MainWindow();
                MainWindow.SizeToContent = SizeToContent.WidthAndHeight;
                MainWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                MainWindow.Show();
            }
        }

        bool IsAdmin()
        {
            WindowsIdentity id = WindowsIdentity.GetCurrent();
            WindowsPrincipal p = new WindowsPrincipal(id);

            return p.IsInRole(WindowsBuiltInRole.Administrator);
        }

        private void StartAsAdmin(StartupEventArgs e)
        {
            string[] args = e.Args;
            try
            {
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
                startInfo.FileName = uri.LocalPath;
                startInfo.Arguments = String.Join(" ", args);
                startInfo.Verb = "runas";
                Process p = Process.Start(startInfo);
            }
            catch (Win32Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }

    }
}

更多信息 奇怪的是,如果我从NT Authority \ System下运行的cmd提示符启动程序,则启动UI没有延迟。在一次成功启动之后,每次进一步启动,从任何提示,无论是标准用户提示,以管理员身份运行,程序都会立即启动;直到我从会话中注销。 再次登录到新的(标准用户)会话后,所有启动程序的尝试都会在显示UI之前导致30秒的延迟。 我只能认为这是微软的某种UAC,这阻碍了wpf的启动。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用清单文件,而不是使用此代码?以管理员身份运行应用程序是您可以使用它执行的操作之一。

这可能有助于https://msdn.microsoft.com/en-us/library/ms742884.aspx