Windows Vista / Windows 7权限:SeDebugPrivilege& OpenProcess

时间:2010-05-28 20:54:57

标签: c++ windows uac privileges openprocess

我能够找到的有关升级到我需要的适当权限的所有内容都与我当前的方法一致,但问题依然存在。我希望也许某人有一些Windows Vista / Windows 7内部体验可能会在只有黑暗的地方发光。我相信这会很长,但请耐心等待。

上下文

我正在开发一个需要访问当前机器上其他进程内存的应用程序。显然,这需要管理员权限。它还需要SeDebugPrivilege(不,它不是SetDebugPrivilege的拼写错误),我相信自己要正确获取,尽管我怀疑是否有更多的权限是不必要的,因此我的问题的原因。到目前为止,Code已成功应用于所有版本的Windows XP,以及我的测试Vista 32位和Windows 7 64位环境。

过程

  • 程序始终以管理员权限运行。这篇文章可以在这篇文章中假设。
  • 将当前流程的Access Token升级为包含SeDebugPrivilege权限。
  • 使用EnumProcesses在系统上创建当前PID列表
  • 使用OpenProcess PROCESS_ALL_ACCESS访问权限
  • 打开句柄
  • 使用ReadProcessMemory读取其他进程的内存。

问题:

在开发和个人测试(包括Windows XP 32& 64,Windows Vista 32和Windows 7 x64)期间,一切都运行良好。但是,在同事的Windows Vista(32位)和Windows 7(64位)计算机上进行测试部署期间,似乎存在权限/权限问题OpenProcess使用通用{{1}失败错误。当以受限用户身份运行时(如预期的那样)以及以管理员身份明确运行(右键单击→以管理员身份运行以及从管理员级别命令提示符运行时)都会发生这种情况。

但是,在我的测试环境中,这个问题对我自己来说是不可再现的。我亲眼目睹了这个问题,所以我相信这个问题存在。我能够在实际环境和测试环境之间辨别的唯一区别是,在UAC提示符下使用域管理员帐户时发生实际错误,而我的测试(没有错误)在UAC提示符下使用本地管理员帐户。

虽然使用的凭据允许UAC“以管理员身份运行”,但该流程仍未获得能够OpenProcess在另一个进程上的正确权限。我不熟悉Vista / Windows 7的内部知识,知道这可能是什么,我希望有人知道可能是什么原因。

踢球者

报告此错误的人,以及谁的环境可以定期重现此错误的人,有一个名为Access Denied的小应用程序,这是一个小型引导程序,似乎升级其自己的权限然后启动传递给它的可执行文件(从而继承升级的权限)。使用此程序运行时,在UAC提示符下使用相同的域管理员凭据,该程序可正常工作,并能够成功调用OpenProcess并按预期运行。

因此,这肯定是获取正确权限的问题,并且已知域管理员帐户 是应该能够访问正确权限的管理员帐户。 (显然获得这个源代码会很棒,但如果可能的话,我不会在这里。)

注释

如上所述,失败的OpenProcess次尝试报告的错误为RunWithDebugEnabled。根据{{​​3}}的MSDN文档:

  

如果调用者启用了SeDebugPrivilege权限,则无论安全描述符的内容如何,​​都会授予所请求的访问权限。

这让我相信在这些条件下可能存在以下问题:(1)获取Access Denied或(2)需要其他特权,这些特权在任何MSDN文档中都没有提及,并且可能在域管理员帐户和本地管理员帐户

示例代码:

SeDebugPrivileges




谢谢!

如果有人对我可能缺少哪些可能的权限,权限,权限等有一些了解,以便在Windows Vista和Windows 7下正确打开另一个进程(假设可执行文件已正确“以管理员身份运行”)在上述条件下,我们将非常感激。

如果我不是绝对难过,我不会在这里,但我希望这个团队的经验和知识再一次闪耀。我感谢你花时间阅读这一面墙。感谢作为使Stack Overflow对所有人都有用的人的类型!

1 个答案:

答案 0 :(得分:13)

因此经过大量调试并困扰很多人获取信息后,我终于能够找到编写RunWithDebugEnabled应用程序的人,并了解其运作方式。

在这种情况下,问题是域管理员的本地策略中的Debug programs权限已被删除,因此进程的访问令牌中不存在SeDebugPrivilege令牌。如果它根本不存在则无法启用,我仍然知道无法将权限添加到现有访问令牌。


当前魔法如何运作:
因此,RunWithDebugEnabled魔术应用程序将使用其管理员权限将自身安装为服务并自行启动,从而在SYSTEM用户帐户而不是域管理员下运行。使用SYSTEM权限,应用程序会创建一个与管理员令牌相同的新访问令牌,只有SeDebugPrivilege令牌存在。此新令牌用于CreateProcessAsUser(),并使用之前缺少的新启用的SeDebugPrivilege运行该程序。

我实际上并不喜欢这个“解决方案”,并一直在寻找一种“更清洁”的方式来获得这种特权。我将在此处发布此问题作为另一个问题,我将尽力记住此处的链接,以帮助其他人跟进并供将来参考。

编辑: Impersonate SYSTEM (or equivalent) from Administrator Account



我感谢你们花时间和精力帮助调试和解决这个问题。非常感谢!