使用 C# 调用另一个进程时避免 UAC 提示

Posted

技术标签:

【中文标题】使用 C# 调用另一个进程时避免 UAC 提示【英文标题】:Avoid UAC prompts when calling another process using C# 【发布时间】:2015-10-26 22:40:05 【问题描述】:

我正在为我的公司开发一个需要管理权限(WMI 调用、注册表访问等)的 iventory 软件。为方便起见,我不希望 UAC 提示用户执行应用程序的许可(是的,即使用户不想要,我也必须强制应用程序运行),并且我不能通过 GPO 禁用 UAC(将是完美的,但很痛苦)。我首先尝试使用另一个进程(C# 上的 Processinfo)将 AD 管理帐户凭据传递给库存软件,但 UAC 提示仍然存在。经过一些研究,我发现如果使用本地管理员凭据,它不会给我任何烦人的提示,但由于我公司的环境一团糟,除了标准化之外,还有许多具有不同凭据的站点。有谁知道我该怎么做? (使用 .net C#)。

【问题讨论】:

改用服务或计划任务。 想象一下你找到了绕过 UAC 的方法。现在将其外推到所有不断针对 Windows 的病毒/恶意软件编写者。它不是为了给您带来不便,而是为了保护用户。 “是的,即使用户不想要,我也必须强制应用运行”——我的意思是,这就是 UAC 存在的全部原因。 您的处理方法似乎不切实际。尝试融入系统而不是颠覆它。 【参考方案1】:

我已经使用Task Scheduler Managed Wrapper 完成了这项工作。确保在设置任务时提供本地管理员组凭据。以下是我在代码中的做法:

        using (TaskService ts = new TaskService())
        
            try
            
                //Create a new task definition and assign properties
                TaskDefinition td = ts.NewTask();
                td.Principal.RunLevel = TaskRunLevel.Highest;
                td.RegistrationInfo.Description = "Paulos Task";
                td.Triggers.Add(new TimeTrigger()  StartBoundary = Convert.ToDateTime("01-01-2003 00:00:01") );

                // Create an action that will launch PauloApp whenever the trigger fires
                td.Actions.Add(new ExecAction("PauloApp.exe", "", Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Paulo")));

                td.Settings.DisallowStartIfOnBatteries = false;
                td.Settings.StopIfGoingOnBatteries = false;

                ts.RootFolder.RegisterTaskDefinition("PaulosTask", td,
                   TaskCreation.CreateOrUpdate, "Administrators", null,
                   TaskLogonType.Group);

                // Register the task in the root folder
                Microsoft.Win32.TaskScheduler.Task t = ts.FindTask("PaulosTask");
                if (t != null)
                    t.Run();
                else
                    //could not find PaulosTask
            //end try
            catch (Exception e)
            
            
        //end using

【讨论】:

我需要提供本地凭据还是可以使用具有管理权限的域凭据? 我只使用本地管理员组对其进行了测试。我想您也可以使用域凭据,但如果您这样做了,我认为您部署应用程序的每个系统都需要将您的域 Windows 用户名作为本地系统上的 Windows 管理员存在?

以上是关于使用 C# 调用另一个进程时避免 UAC 提示的主要内容,如果未能解决你的问题,请参考以下文章

在 vista 中避免 UAC

如何在启动程序且 UAC 被禁用时强制提示输入凭据?

启动隐藏的控制台进程,但仍然有 UAC 提示

如何使用子进程模块杀死(或避免)僵尸进程

c#在以管理员权限运行控制台命令时,怎么不让它弹出uac提示框?

从使用更安全令牌创建的进程调用时,RunAs Verb 不显示 UAC 弹出窗口且不提升