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

时间:2015-10-26 22:40:05

标签: c# .net uac impersonation

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

1 个答案:

答案 0 :(得分: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