windows - 没有密码的用户只有在管理员组中才能被模拟

标签 windows impersonation createprocessasuser

目标是让服务创建一个进程,该进程具有其密码未知的用户的安全上下文。
我了解并接受新流程只能访问本地资源的限制

我想我已经解决了。只要要模拟的用户在本地管理员组中,一切都可以正常工作。
但是,如果没有,我会得到一个异常0xc06d007e。
被模拟的用户似乎缺少在管理员组中的权限或特权。
但是,如何通过反复的错误遍历成千上万的排列来找出缺失的权利/权限/特权是什么?

get a token for the user to  be impersonated 
token = new WindowsIdentity("username@domain").Token
create a primary token
token2 = duplicatetokenex(token)

要创建的过程是一个简单的控制台应用程序,实际上我什至不需要控制台。
process_creation_flags.DETACHED_PROCESS
| process_creation_flags.CREATE_NO_WINDOW
| process_creation_flags.CREATE_NEW_PROCESS_GROUP

尝试以模拟用户身份启动新过程
createprocessasuser(token2, "myapplication.exe" etc etc)`

正如我所说的,如果username @ domain在本地管理员组中,则此方法很好
否则我会收到异常0xc06d007e,我认为是在尝试启动新进程时

最佳答案

作为创建服务的步骤之一,我将代码作为控制台应用程序运行,而在那个阶段,我遇到了上面提到的异常。

但是我发现将代码作为服务运行是可以的!

因此,我从未发现当从控制台应用程序进行模拟时,为什么要模拟的用户(模拟用户?)需要位于本地管理员组中。
我怀疑这与 session 和/或台式机有关。

我还没有找到许多讨论方案来模拟您不知道其密码的用户。因此,我只想向所有有问题的人保证,这确实是可能的,重点是:
1)将代码作为服务运行(使用本地系统或具有所有必需特权的用户)
2)从windowsidentity获取s4u token (如果调用具有所需的特权,这将是模拟 token )
3)使用duplicatetokenex从模拟 token 创建主 token
4)使用来自3的 token createprocessasuser

请注意,该过程将只能访问本地资源

关于windows - 没有密码的用户只有在管理员组中才能被模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57232062/

相关文章:

c# - Entity Framework 和模拟

winapi - 从非交互式服务 (win32/.net/powershell) 启动 UAC 提升进程

c++ - 如何使用来自 SSPI 的委派凭据在 Windows 上创建 ProcessAsUser?

c# - ASP.NET CORE 1.0,模拟

security - 当前用户是LocalSystem 检查?

c# - 从 Windows 服务打印时,CreateProcessAsUser 不使用 LogonUser token

windows - 如何从 RUN 启动具有特定窗口大小的 powershell?

r - Windows 上的 H2O XGBoost : Error: java. lang.UnsatisfiedLinkError : ml. dmlc.xgboost4j.java.XGBoostJNI.XGDMatrixCreateFromCSREx([J[I[FI[J]I

python - 如何在 Windows 上修复 python 的 getaddrinfo 失败

c++ - 是否可以构建一个匹配 3 个或更多非连续 UTF 代码点的 PCRE UTF-8 正则表达式