作为另一个用户运行程序

时间:2014-05-24 10:42:36

标签: c++ windows winapi

我正在尝试在我的程序中以另一个用户身份启动应用程序。这是我的代码的样子:

result = CreateProcessWithLogonW(username.c_str(),domain.c_str() , password.c_str(),
             LOGON_NETCREDENTIALS_ONLY, exePath.c_str() ,NULL, 0, NULL, NULL, &su_info, &pi);

这完全没问题。但是我注意到当我使用这种方法(LOGON_NETCREDENTIALS_ONLY)运行我的程序并查看我在任务管理器中的程序时,它显示为作为调用进程而不是我期望的用户运行。这种登录实际上存在其他问题,但为了简单起见,让我们关注任务管理器的行为。因此,为了解决此问题,我将登录标志更改为LOGON_WITH_PROFILE

result = CreateProcessWithLogonW(username.c_str(),domain.c_str() , password.c_str(),
             LOGON_WITH_PROFILE, exePath.c_str() ,NULL, 0, NULL, NULL, &su_info, &pi);

但是现在我创建了进程失败并返回错误代码1326(用户名或密码不正确) 为什么会这样?如何以另一个用户身份运行我的可执行文件,并实际看到它甚至在任务管理器中以该用户身份运行?

修改
更多的调试表明,如果我正常运行程序,程序运行正常。但是,如果我将程序作为构建后事件运行(运行我的测试),则此类登录将失败。

1 个答案:

答案 0 :(得分:1)

当您查看CreateProcessWithLogon的MSDN页面时,它明确说明了(强调我的):

  

LOGON_NETCREDENTIALS_ONLY

     

登录,但仅使用网络上的指定凭据。新进程使用与调用方相同的标记,但系统在LSA中创建新的登录会话,并且该进程使用指定的凭据作为默认凭据。   此值可用于创建在本地使用不同凭据集的进程,而不是远程进程。这在没有信任关系的域间方案中很有用。   系统未验证指定的凭据。因此,该过程可以启动,但可能无法访问网络资源。

这样就解释了您在任务管理器中看到的行为,并提供了第一种方法工作原理的可能解释,而第二种方法没有。

在继续讨论第二个问题之前,您是否可以验证LOGON_WITH_PROFILE在非构建后的情况下是否正常工作?