从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服务中,然后把wpf应用程序作为前端?这样,如果用户杀死了它,它就不会停止服务。然后服务可以定期检查wpf前端是否启动,如果需要,可以重新启动它
我认为这将是一个比你试图做的更"可信"的设计,这可能会让防病毒软件认为你是一个坏软件并阻止你。
为了保护windows服务,这里还有另一个问题:保护windows服务免受不受信任的用户的攻击
我认为你不能(当然也不应该)做到这一点。最好的办法是创建一个不需要提升权限的应用程序,然后使用IPC与您的服务进行对话,然后由该服务代表用户执行管理任务。