从windows服务创建交互式提升进程,并向登录用户显示

本文关键字:登录 显示 用户 进程 服务 windows 创建 交互式 | 更新日期: 2023-09-27 18:29:12

我有一个服务,当用户登录时会产生一个WPF应用程序进程。

但由于某种原因,WPF应用程序在创建后大约10分钟就被杀死了?终止是立即的,在事件日志中没有找到任何跟踪,在WPF应用程序中也没有调用任何正常的关闭/退出事件

事实上,当终止发生时,Windows 7似乎会挂起一秒钟,鼠标变得没有反应,然后在短暂的延迟后表现出鼠标手势(当它正常化时,但现在缺少创建的过程)。

何时

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
        CanHandleSessionChangeEvent = true;
    }
    protected override void OnSessionChange(SessionChangeDescription changeDescription)
    {
        if (changeDescription.Reason == SessionChangeReason.SessionLogon
            && changeDescription.SessionId > 0)
        {
            ApplicationLoader.PROCESS_INFORMATION procInfo;
            ApplicationLoader.StartProcessAndBypassUAC(@"myapp.exe", out procInfo);                    
        }
        base.OnSessionChange(changeDescription);
    }
}

根据Pero-Matic代码创建流程

// ...
bool result = CreateProcessAsUser(hUserTokenDup,  // client's access token
                            null,             // file to execute
                            applicationName,  // command line
                            ref sa,           // pointer to process SECURITY_ATTRIBUTES
                            ref sa,           // pointer to thread SECURITY_ATTRIBUTES
                            false,            // handles are not inheritable
                            dwCreationFlags,  // creation flags
                            IntPtr.Zero,      // pointer to new environment block 
                            null,             // name of current directory 
                            ref si,           // pointer to STARTUPINFO structure
                            out procInfo      // receives information about new process
                            );
  • 然而,如果我的目标是notepad.exe,终止似乎不会发生
  • 用一个普通的''空的WPF应用程序(.NET4)测试了它,它也崩溃了

具有管理权限且无提示的流程创建

  • 问题似乎是试图从winlogon.exe复制管理SYSTEM令牌(但该令牌正在会话1+中运行),因为如果您复制特定用户令牌(例如从explorer.exe复制),则崩溃不再存在
  • 这一点在相同的vanilla/空的WPF应用程序中得到了证实,并且在此处运行Marcel Roma代码——注意,他使用的是explorer.exe而不是winlogon.exe
  • 尽管使用explorer.exe可以消除终止,但我失去了管理权限,这对我的不起作用

  • 有什么想法可以让它与winlogon进程令牌一起工作吗?

  • 或者是否可以调整exlorer.exe令牌以使副本提升?我在猜测如何使用TokenElevation和SetTokenInformation或AdjustTokenPrivileges
  • 或者可能是Windows 7被打了补丁,不允许这种进程模拟
  • 或者,是否有任何方法可以获得具有管理权限的特定用户令牌(而不是所有者是SYSTEM),但同样不需要密码知识/提示(不包括CreateProcessWithLogonW
  • 这可能与垃圾收集有关吗

从windows服务创建交互式提升进程,并向登录用户显示

我只是建议你解决一下:为什么你不把你的核心功能放在windows服务中,然后把wpf应用程序作为前端?这样,如果用户杀死了它,它就不会停止服务。然后服务可以定期检查wpf前端是否启动,如果需要,可以重新启动它

我认为这将是一个比你试图做的更"可信"的设计,这可能会让防病毒软件认为你是一个坏软件并阻止你。

为了保护windows服务,这里还有另一个问题:保护windows服务免受不受信任的用户的攻击

我认为你不能(当然也不应该)做到这一点。最好的办法是创建一个不需要提升权限的应用程序,然后使用IPC与您的服务进行对话,然后由该服务代表用户执行管理任务。