- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 Unix 中,当代表某个用户执行某些操作时,系统程序通常调用 seteuid(UID)(附带 setegid())首先切换到该用户,执行该操作,并在完成时切换回 super 用户使用 seteuid(0)。我对 seteuid() 计时,它的时间大约为一到几微秒(这意味着,相对于需要完成的操作(如操作文件或运行 CGI 程序),它非常便宜)。
我不熟悉 Windows API。我们是否在 Windows 上做同样的事情(但使用 ImpersonateLoggedOnUser() + RevertToSelf() API 函数)?一般来说,这些功能有多快?
最佳答案
它大部分是相同的,但要记住一个重要的区别:您提到的 Windows API 需要一个有效 token 的句柄。
换句话说,即使以 SYSTEM 身份运行(或任何具有 SeTcbPrivilege 的进程),您也需要模拟一个登录用户。
用户可以通过多种方式登录:
在大多数情况下,创建进程将使其继承当前 token 。
无论您在 IIS 中使用 Kerberos、NTLM 还是 HTTP BASIC 身份验证都无关紧要。它全部由 Windows 进行身份验证,因此您将获得一个 token 。另一方面,Tomcat 中的 HTTP BASIC 身份验证不会为您提供 Windows token ,因此无法进行模拟。
现在是棘手的部分。
仔细想想, token 实际上只是一个内存结构,带有用于授权 (DACL) 和审计 (SACL) 的访问控制列表。它是由 Authentication Package 创建的(美联社)。它是创建 token 的 AP。有点像 Unix 中的 PAM,AP 可以用自定义代码代替。
事实上,开源的setuid Authentication Package是存在的。将 CVS 移植到 Windows NT 的人们完成了编写 AP 的工作 creates a token out of thin air ,只要您拥有 SeTcbPrivilege(相当于 root)。我从未尝试过,但它可以在本地机器上为不存在的用户提供 token 。该代码相当旧(它只会创建提升的 token )但除此之外,它是 LGTM。不涉及身份验证、密码或智能卡,因此使用该 token 运行的进程将无法使用它来对另一台计算机进行身份验证。
总结:
一个建议:我的Programming Windows Security的副本全是咖啡的黄色,上面挂着便利贴和撕破的纸页。关于该主题的最佳文本,如果您想了解 Windows 安全性,则必须阅读。
关于windows - Windows 的 ImpersonateLoggedOnUser() + RevertToSelf() 与 Unix 的 seteuid() + setegid() 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12299455/
成功调用 LogonUser 和 ImpersonateLoggedOnUser 后,我的进程似乎没有作为新用户运行... 系统(“我是谁”); 打印出来:克里斯-PC\克里斯 什么时候应该:克里斯-
我有一个使用 ImpersonateLoggedOnUser 的 Windows 服务为了放弃系统权限并使用当前用户权限运行另一个应用程序。 如果对 ImpersonateLoggedOnUser 的
我有一个安装程序在安装完成后尝试在当前用户上下文中(重新)启动我的应用程序。安装程序在 SYSTEM 上下文中运行,并在启动应用程序之前尝试(理论上成功)模拟当前用户。但是,当我查看任务管理器时,我发
我正在尝试移动文件,但出现此错误: System.UnauthorizedAccessException: Access to the path is denied.. at System.IO.__
我有一项服务正在模拟用户。该服务作为本地系统运行。用户是本地管理员和域管理员。模拟之后,我有必要调整进程的 token 权限。我希望使用 OpenProcessToken 然后在返回的 token 句
我正在尝试从 Windows 服务(以 SYSTEM 身份运行)调用 Windows API(似乎只能在登录用户的上下文中工作)。我能够获得登录用户的 token 。当我调用 ImpersonateL
我编写了一个 C++ Windows 应用程序 (A),它使用 LogonUser、LoadUserProfile 和 ImpersonateLoggedOnUser 来获得另一个用户 (Y) 的权限
在 Unix 中,当代表某个用户执行某些操作时,系统程序通常调用 seteuid(UID)(附带 setegid())首先切换到该用户,执行该操作,并在完成时切换回 super 用户使用 seteui
我是一名优秀的程序员,十分优秀!