【问题标题】:Library that has rights of different user than executable that calls it具有与调用它的可执行文件不同的用户权限的库
【发布时间】:2016-04-20 13:11:56
【问题描述】:

我的系统中有两个用户:

username: superuser  pass:aaa //user that has many rights
username: nothing  pass:bbb //user that has minimum rights

我有 ececutable aaa.exe 调用库函数 bbb.dll

用户nothing 运行可执行程序aaa.exeddd.dll 应该访问仅对超级用户可用的资源。 bbb.dll 能否以超级用户身份登录并获得权限?如何实施?为此我应该使用哪些 API 函数?

【问题讨论】:

  • 实际上你应该使用两个进程
  • DLL 没有安全令牌,进程有 - 特别是线程会有(通过模拟)。

标签: windows winapi visual-c++ credentials


【解决方案1】:

如果用户完全不同,并且您的超级用户的登录凭据位于足够模糊的位置,则可以在进入 dll 函数时使用LogonUserImpersonateLoggedOnUser

这非常不稳定,因为非超级用户在技术上可以访问超级用户凭据,除非您在某种锁定的沙箱中运行他们的应用程序。

如果您尝试调用 UAC,那么最可靠的解决方案是让 ddd.dll 生成一个运行提升的工作程序 exe。您可以使用ShellExecute/Ex() 并将lpOperation 设置为"runas" 来强制提升。如果exe出现,可以将lpOperation设置为NULL或"open",根据需要让UAC正常提示。无论哪种方式,这都会调用系统自己的提升 GUI,提示用户升级自己的帐户,或选择不同的管理员(超级用户)帐户来完成他们的操作。

【讨论】:

  • 另一种选择是将 DLL 本身实现为 COM 对象,然后 EXE 可以在需要时使用 COM Elevation Moniker 在不同的用户上下文中使用 UAC 提示来实例化 DLL 对象。无需生成单独的进程。
  • 我看到你已经编辑了我对引用调用 CreateProcess 的回复。我很确定 CreateProcess 不会触发 UAC GUI - 它只是返回一个错误代码。 ShellExecute 必须用于触发提升提示。
  • 你说得对,我忘了。自从我不得不处理 UAC 提升问题以来已经有一段时间了。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 2012-09-30
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2022-11-14
相关资源
最近更新 更多