从非特权应用程序(通过RPC)开放HKCR和HKCU为另一个用户

时间:2015-10-19 00:28:36

标签: c++ winapi registry rpc

无法在非特权应用中实现跨用户注册表访问(通过本地RPC)。情况如下:

  • 我正在编写一个可以访问RPC服务器的沙盒应用程序,但几乎无法访问注册表。
  • 我在与沙盒应用程序相同的计算机上运行作为LocalSystem的RPC服务器。使用的RPC传输是LRPC(ncalrpc)。
  • 我想让应用程序浏览注册表的各个部分 - 包括其他用户拥有的密钥 - ,无需编辑注册表项上的ACL,直接授予此应用程序访问权限。

目前,应用程序调用RPC服务器,该服务器将HKEY打开到请求的路径,然后使用DuplicateHandle将其传回应用程序。

  • 这适用于HKLM和HKU。该应用程序接收HKEY并可以使用它来枚举子项和读取值。
  • 对于那些荨麻疹的子项,它也很有效。该应用程序获取子项并可以枚举其内容。
  • 我希望能够处理HKCU(完全按用户)和HKCR(系统classes root和每用户classes root的联合)的内容。 LocalSystem(RPC服务运行的内容)。

到目前为止我尝试过:

  • 让应用尝试打开根密钥本身,然后将它们(通过DuplicateHandle)传递给RPC服务器而不是预定义的密钥。
    • 即使对于应用程序自己的用户,这也不起作用;应用程序可以打开密钥(访问权限非常有限),但服务器显然无法打开这些传入的根HKEY的子密钥(可能是由于原HKEY的权限较低?)。
    • 对于其他用户,根本不起作用;该应用无权使用RegOpenUserClassesRoot等功能(无法获取其他用户的令牌)或RegOpenCurrentUser(应用无法冒充其他用户)。
  • 让应用程序在服务器上调用RegOpenUserClassesRootRegOpenCurrentUser,并将这些HKEY传递回应用程序(通过DuplicateHandle,以及对所有HKEY的处理方式)。然后,应用程序存储这些返回的密钥,并在想要打开这些密钥的子密钥时将它们复制到服务器。这也不起作用(导致访问被拒绝错误)。

我可以尝试的事情:

  • 当客户告诉服务器获得用户的HKCU或HKCR时,让服务器按需获得所需的reg密钥。下行是重复呼叫的更多开销(无法重复使用密钥,除非大量缓存继续进行),上行是避免DuplicateHandle循环(可能成为问题) , 不知何故...)。似乎不太可能真正解决问题,但我还没有尝试过。
  • 更改注册表项ACL以直接为应用程序提供所需的访问权限。这仍然要求服务器能够打开用户试图识别的注册表项。我甚至不确定每个用户的HKCR联合视图是否存在,直到有人试图打开该密钥。
  • 再次查看代码,寻找迄今为止我未能找到的错误,缩小问题可能原因的范围。到目前为止,这还没有解决这个问题,虽然它确实让我解决了我使用这个RPC服务器的另一个问题(这是我写的第一个大规模的MSRPC代码)所以也许我会得到幸运的是这一次。如果我尝试应该之一的事情已经发挥作用,这显然也是要做的事情,但事实并非如此。

任何有这方面经验的人都知道我做错了什么?

0 个答案:

没有答案