以提升的权限调用自定义操作,但不是作为 LocalSystem

Posted

技术标签:

【中文标题】以提升的权限调用自定义操作,但不是作为 LocalSystem【英文标题】:Call Custom Action with elevated privileges but not as LocalSystem 【发布时间】:2016-10-02 09:55:15 【问题描述】:

我想从自定义操作创建计划任务。我需要提升权限才能创建它。我正在使用Task Scheduler Managed Wrapper。

    using (TaskDefinition taskDefinition = TaskService.Instance.NewTask())
    
        taskDefinition.RegistrationInfo.Date = DateTime.Now;
        taskDefinition.RegistrationInfo.Description = "...";
        taskDefinition.Principal.RunLevel = TaskRunLevel.Highest; // Scheduled Task with elevated privileges

        DailyTrigger trigger = new DailyTrigger();
        try
        
            trigger.StartBoundary = new DateTime(DateTime.Today.Ticks)
                .AddHours(20);
            trigger.ExecutionTimeLimit = TimeSpan.FromSeconds(30);
            trigger.DaysInterval = 2;
        
        catch
        
            trigger.Dispose();
            throw;
        

        taskDefinition.Triggers.Add(trigger);
        taskDefinition.Actions.Add(Path.Combine(session.CustomActionData.Keys.Single(), "Updater.exe"));

        TaskService.Instance.RootFolder.RegisterTaskDefinition(TaskName, taskDefinition);
    

根据How to run custom executable with elevated privileges?我必须使用

impersonate='no'

这可行,但我想让调用 MSI 的用户作为计划任务的用户。但上述解决方案让 MSI 将自定义操作调用为 LocalSystem 然后使用 LocalSystem 用户创建计划任务。

计划任务调用从 UNC 路径读取的 exe。所以 LocalSystem 不会在那里工作。

如何使用具有提升权限的 MSI 用户调用自定义操作?

【问题讨论】:

您能否确认自定义操作未配置为延迟? 【参考方案1】:

要使用安装用户的凭据运行提升的自定义操作,您必须提升整个 MSI 进程启动,并在您的自定义操作中使用 impersomnate=yes。启动通常使用具有提升清单的启动程序完成,并使用 CreateProcess 启动启动 MSI,或者最好直接调用 MsiInstallProduct(或等效项)。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa370315(v=vs.85).aspx

【讨论】:

以上是关于以提升的权限调用自定义操作,但不是作为 LocalSystem的主要内容,如果未能解决你的问题,请参考以下文章

WiX MSI 和 EXE 作为一个 EXE

具有权限的自定义操作

用于检查应用程序是不是以提升的权限运行的 PowerShell 命令

如何使用自定义 SVM 内核?

MSF内网渗透系列2-权限提升

给普通用户自定义创建 Kubernetes 权限