从Windows服务创建交互式提升流程并向登录用户显示

Cel*_*Cel 13 .net c# impersonation windows-services process

我有一个服务,当用户登录时产生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);
    }
}
Run Code Online (Sandbox Code Playgroud)

按Pero Matic Code创建流程

// ...
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
                            );
Run Code Online (Sandbox Code Playgroud)
  • 但是,如果我定位notepad.exe,似乎不会发生终止?
  • 用vanilla\empty WPF应用程序(.NET 4)测试它,并且崩溃了

使用管理权限创建进程并且没有提示

  • 似乎问题是尝试SYSTEMwinlogon.exe(但在会话1+中运行)复制管理令牌,因为如果您复制特定的用户令牌(例如从explorer.exe),那么崩溃就不复存在了!
  • 这是通过相同的vanilla/empty WPF应用程序确认的,并在此处运行Marcel Roma代码 - 请注意他使用explorer.exe而不是winlogon.exe
  • 虽然使用explorer.exe摆脱终止我失去了管理权限,这对我不起作用

  • 任何想法如何使它与winlogon进程令牌一起使用?

  • 或者是否可以调整exlorer.exe令牌以使副本升高?我猜测使用TokenElevationSetTokenInformationAdjustTokenPrivileges
  • 或者是否可以Windows 7修补禁止这种程序假冒?
  • 或者,有没有办法获得具有管理权限的特定用户令牌(而不是所有者SYSTEM),但再次,没有密码知识/提示(不包括CreateProcessWithLogonW)
  • 这可能与垃圾收集有关吗?

Fab*_*ske 5

好吧,我只是建议你一个解决方法:为什么你不把你的核心功能放在Windows服务中,然后使用wpf应用程序作为前端?因此,如果用户将其终止,则不会停止该服务.然后,服务可以定期检查wpf前端是否已启动,如果需要,可以重新启动它.

我认为这将是一个更"可信"的设计,你正在尝试做的,这可能让防病毒软件认为你是一个糟糕的软件并阻止你.

为了保护Windows服务,还有另一个问题:保护Windows服务不受信任的用户

  • 我知道windows vista(和7)中有一个名为"NT SERVICE\TrustedInstaller"的特殊用户.当文件属于该用户时(所有系统文件都是如此),没有人可以修改它.我认为*这对服务来说是一样的,但我不确定.无论如何,你将无法完全阻止对管理员和具有深厚计算机知识的人的访问(即他可以在安全模式下重启......) (2认同)
  • 我有另一个想法:双击该服务,然后选择登录为,并将其更改为为您的应用程序创建的特定用户.然后转到注册HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services并通过右键单击选择您的服务,选择权限,然后编辑谁可以执行的操作:您可以删除除app app用户之外的所有人.小心我没有测试过这个解决方案,但它应该有效.然后,您可以将这些操作放入安装程序中. (2认同)