windows - 使用正确的 PEB 和 ACL 从服务中创建ProcessAsUser

标签 windows winapi

我已经阅读了大量关于这个问题的问题,但我没有找到真正明确的指南来以正确的方式做到这一点。

我的目标是枚举[断开连接和事件]用户控制台 session 并在每个 session 中启动一个进程。每个用户 session 进程在其 DACL 中至少需要以下权限:

Token access rights :

Process access rights :

但是正如您所读到的 here (底部):"Windows Vista introduces protected processes to enhance support for Digital Rights Management. The system restricts access to protected processes and the threads of protected processes."
所以我想也许只能用 PROCESS_QUERY_LIMITED_INFORMATION我可以获得有关其他进程的一些信息。我试过QueryFullProcessImageName()对于从 Vista 开始的提升进程(请参阅 Giori's answer ),但它 doesn't work anymore as it seems .
解决方案:使用 Windows 服务的重复 token CreateProcessAs_LOCAL_SYSTEM
问题:生成的进程应将各自登录用户的环境变量设置为能够定位网络打印机和映射驱动器等。但是,如果我使用服务的 token ,我会继承其 PEB,甚至无法将映射的驱动器转换为其 UNC 路径。

所以我开始寻找“提升”进程并绕过 UAC 提示的方法,我尝试过:

  • 启用一些权限,例如 SE_DEBUG_PRIVILEGE在 token 中使用 AdjustTokenPrivileges() (如果 token 没有这些权限则不起作用,可以先使用LookUpPrivilegeValue()进行验证)
  • 使用 winlogon.exe. 中的 token (不起作用)
  • 更改 DACL ( source code )(不起作用)

我遵循的步骤是:

  1. 使用 WTSEnumerateSessions() 枚举 session
  2. 获取 token (两种选择):
  3. 使用 DuplicateTokenEx() 复制 token
  4. LookUpPrivilegeValue()/AdjustTokenPrivileges() (没用?)
  5. CreateEnvironmentBlock()
  6. CreateProccessAsUser() ,标志:NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT ,启动信息桌面:"WinSta0\Default"
  7. 更改进程 DACL(参见上面的链接,没用?)
  8. Dispose/Clean:销毁创建的PEB,关闭打开的句柄并释放内存。

我的问题:如何授予使用 CreateProccessAsUser() 创建的进程来自在 LOCAL_SYSTEM 下运行的 Windows 服务帐户足够的特权/权限来获取其他进程的信息(来自其他 session ;其他用户和不同的完整性级别)而不丢失用户的环境变量?

最佳答案

您对很多事情感到困惑。

Every user session process requires at least these rights in its DACL

进程 DACL 控制对该进程的访问,但它无法确定该进程具有哪些访问权限。进程的安全 token 决定访问权限。

Windows Vista introduces protected processes to enhance support for Digital Rights Management.

很明显,您还没有足够担心 protected 进程。首先让它适用于普通流程!

The spawned processes should have the respective logged on user's environment variables set to be able to locate network printers and mapped drives among other things.

网络打印机和映射驱动器与环境变量无关。我认为您要做的是将新进程放入用户的登录 session 中,这就是控制网络驱动器映射等的内容。

how to grant the process created using CreateProccessAsUser() [...] enough privileges/rights to get information on other processes (from other sessions; of other users and different integrity levels) without losing the user's environment variables ?

不要。这会违反安全模型的完整性。

相反,从系统服务枚举和查询进程,并使用共享内存(在 MSDN 中查找“文件映射对象”)或其他合适的 IPC 机制,仅传递用户 session 进程所需的任何信息。

关于windows - 使用正确的 PEB 和 ACL 从服务中创建ProcessAsUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23065810/

相关文章:

windows - 使用WMI检索当前的混音器电平?

c++ - 名称映射--\\.\PhysicalDrive 到\\.\SCSI

windows - Windows 7 上的 R CMD 错误 - "R"未被识别为内部或外部命令,

python - 在 Django 产品中从 Python 2.6 升级到 Python 2.7

com - EXE(进程外)COM服务器是否可以免注册激活?

c++ - C/C++ header 、dll 和导出

winapi - 所有者绘制组合框的垂直尺寸大于非所有者绘制组合框的垂直尺寸

c++ - 打开对话框

css - 如何在 Windows 上的 Safari 中进行测试?

c++ - 使用 std::wofstream 写入文件。该文件仍然是空的