目标是让服务创建一个进程,该进程具有其密码未知的用户的安全上下文。
我了解并接受新流程只能访问本地资源的限制
我想我已经解决了。只要要模拟的用户在本地管理员组中,一切都可以正常工作。
但是,如果没有,我会得到一个异常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/