2

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

我想我已经接近解决方案了。只要要模拟的用户在本地管理员组中,一切正常。但如果不是,我会得到一个异常 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)`

正如我所说,如果用户名@域在本地管理员组中,这可以正常工作,否则我会收到异常 0xc06d007e 我认为当新进程尝试启动时

4

1 回答 1

1

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

但是我发现将代码作为服务运行很好!

因此,当从控制台应用程序完成模拟时,我从未发现为什么要模拟的用户(被模拟者?)需要在本地管理员组中。我怀疑这与会话和/或桌面有关。

我还没有发现很多关于该场景模拟您不知道密码的用户的讨论。所以我只想再次向任何有问题的人保证这确实是可能的,要点是:1)将代码作为服务运行(使用本地系统或具有所有必需权限的用户)2)从windowsidentity(如果调用具有所需的权限,这将是一个模拟令牌) 3)使用 duplicatetokenex 从模拟令牌创建一个主令牌 4)使用来自 3 的令牌创建processasuser

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

于 2019-08-25T15:38:05.137 回答