问题 UAC高程

菲尔

成员
已加入
2017年1月30日
留言内容
5
编程经验
Beginner
(初学者)你好,

现在手续已不复存在,我想知道这里的任何人是否有UAC的经验。

我提出问题的原因如下。我在一个小型FSU(现场服务实用程序)上工作,以帮助我们的现场工程师与我们拥有的客户端一起使用,问题是客户端系统将EnabledLUA运行为0-effectivley已禁用。

如果我左移并右键单击该应用程序,然后选择以其他用户身份运行,则可以使用管理员权限运行该应用程序,到目前为止,我以这种方式进行管理,但有点不足。

所以我的问题是我如何在禁用uac的情况下强制Runas或UAC提示

我已经在我的program.cs中

C#:
static void Main()
        {
            WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
            bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);


            if (!hasAdministrativeRight)
            {
                ProcessStartInfo startInfo = new ProcessStartInfo();
                startInfo.UseShellExecute = true;
                startInfo.WorkingDirectory = Environment.CurrentDirectory;
                startInfo.FileName = Application.ExecutablePath;
                startInfo.Verb = "runas";
                try
                {
                    Process p = Process.Start(startInfo);
                    Application.Exit();
                }
                catch (System.ComponentModel.Win32Exception ex)
                {
                    MessageBox.Show("This utility requires elevated priviledges to complete correctly.", "Error: UAC Authorisation Required", MessageBoxButtons.OK);
                    //Debug.Print(ex.Message);
                    return;
                }
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }

但是禁用uac会导致程序挂起,如果我检查任务管理器,我可以看到应用程序不断关闭并重新打开,只有一种停止它的方法是注销/重新启动

任何帮助表示赞赏

谢谢

菲尔

p.s忘记添加

我的应用清单文件中已经有requireAdministrator
 
Last edited:

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,050
地点
挪威
编程经验
10+
我的应用清单文件中已经有requireAdministrator
那和"runas"是UAC的特色,没有UAC的人将无能为力。这适用于实际上可以关闭UAC的旧系统,在较新的系统中,只能关闭通知,并且这些UAC提升应以静默方式发生。

您可以将ProcessStartInfo的用户名和密码(UseShellExecute:false)设置为管理员帐户。 (这意味着"以其他用户身份运行")

如果我检查任务管理器,我会看到该应用程序不断关闭并重新打开
您的代码应避免这种情况,例如存储用于重新启动尝试的值,并在尝试再次重新启动之前检查该值。
 

菲尔

成员
已加入
2017年1月30日
留言内容
5
编程经验
Beginner
谢谢约翰为您提供的想法,我如何以另一种方式做到这一点,如下所示,我希望它能对某些人有所帮助,因为我一直在努力地将其分类,这一点已放在program.cs中

C#:
        static void Main(string[] args)        {


            if (IsAdministrator() == false)
            {
                try
                {
                    System.Diagnostics.Process p = new System.Diagnostics.Process();
                    p.StartInfo.Domain = "Domain_Here";
                    p.StartInfo.UserName = "Username_Here";
                    p.StartInfo.FileName = "Filename.exe";
                    //p.StartInfo.Arguments = "";
                    System.String rawPassword = "Password_Here";
                    System.Security.SecureString encPassword = new System.Security.SecureString();
                    foreach (System.Char c in rawPassword)
                    {
                        encPassword.AppendChar(c);
                    }


                    p.StartInfo.Password = encPassword;
                    p.StartInfo.UseShellExecute = false;
                    p.Start();
                    Environment.Exit(0);
                    
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error");
                }
            }
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        private static bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
 
最佳 底部