杀死VB6中由其他用户拥有的进程

时间:2015-12-04 21:51:19

标签: winapi vb6

我需要能够杀死在不同用户下运行的进程。这是scenerio用户1(管理员或标准用户)切换用户但使应用程序A运行。用户2(标准用户)登录到同一台计算机时登录到应用程序A我需要终止在用户1下运行应用程序A的进程。我在数据库中有默认的管理员用户名和密码。如果他们都是管理员,我所做的将终止该过程,但如果用户2是标准用户则不会。我如何以不同的用户身份杀死进程?这是我到目前为止所做的。

'foo'

在应用程序的加载事件期间使用nameofprogram.exe作为参数调用KillApp。我试图远离shell调用,因为在最终用户环境中有一些实例cmd line和shell被禁用

1 个答案:

答案 0 :(得分:1)

  

如何以不同的用户身份杀死进程?

要回答问题的这一部分,因为它似乎是您最感兴趣的方面,我相信(除非您的程序使用提升的权限运行)唯一可靠的杀死目标进程X的方法特定帐户Y(您拥有凭据)的上下文是启动在Y的上下文中运行的子进程以代表您杀死X.

您可以使用CreateProcessWithLogonW功能执行此操作。

有一点需要注意:如果Y是管理员,并且启用了UAC,子进程将使用有限令牌运行,而不是提升令牌。因此,您无法使用此方法来利用管理凭据。但是,如果X上的权限直接授予对Y的访问权限,而不是仅授予管理员组,则它仍然可以正常工作。

(在您的特定方案中,这可能意味着您需要在启动应用程序A时显式设置或更改流程的权限。如果您使用CreateProcess,则可以使用{为新流程分配显式权限{1}}参数。)

请特别注意,除非您拥有SeImpersonatePrivilege,否则不能使用模拟,默认情况下,SeImpersonatePrivilege仅授予管理员和系统服务,因此该方法不太可能成功。 (文档说如果您使用显式凭据自己创建令牌,则可以模拟没有SeImpersonatePrivilege的令牌,但实际上这似乎不是真的。)