1

我有一个 Windows 可执行文件,它通过使用一组指定的用户详细信息调用 CreateProcessWithLogonW() 从服务中启动。

这可以正常工作,并且该过程按预期开始。然而,当这个进程试图自己启动其他进程时,目前只使用 CreateProcess() 这些启动然后立即死亡 - 它们是需要桌面访问的可执行文件。

在阅读了微软关于 CreateProcess() 的文章后 - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

我认为可以看出为什么会发生这种情况,并且在一定程度上是有道理的。CreateProcess() 知道调用进程正在模拟用户,因此它使用它的父进程,在本例中是本地系统帐户。但是当然,在本地系统帐户中运行的任何东西都没有我们需要的访问权限,因此启动的进程会死掉。

奇怪的是,当我之前使用 LogonUser() 和 CreateProcessAsUser() 在服务中启动初始可执行文件时,它运行良好。但是由于没有正确权限的问题,我不得不将其更改为 CreateProcessWithLogonW()。

有人知道解决这个问题吗?我在网上其他地方看到过关于这个的讨论,但没有任何明确的解决方案。似乎我可能需要我在 CreateProcessWithLogonW() 中登录的用户的令牌,以便以后可以使用它来启动其他进程?但是我无法获得这个令牌,可以以任何方式为当前用户检索它吗?

任何帮助将不胜感激,谢谢:)

4

4 回答 4

2

我们使用我很久以前找到的一些代码解决了这个问题。源模块之一的“版权”部分包含以下内容:

/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
// 
// Written by Valery Pryamikov (1999)
// 
// Command line utility that executes a command under specified user identity 
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility 
//   and from tlist sample (Microsoft Source Code Samples)
//
// Use:
//  CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
//       [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
//  Command must begin with the process (path to the exe file) to launch
//  -i        process will be launched under credentials of the 
//            "Interactive User" (retrieved from winlogon\shell process)
//  -a        process will be launched under credentials of the user 
//            specified in "RunAs" parameter of AppID.
//  -s        process will be launched as local system
//  -u -d -p  process will be launched on the result token of the 
//            LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
// 
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////

也许这些信息会在您的谷歌搜索中产生点击 - 我尝试了一些快速尝试,但空手而归。我们将内部分解为一组 API,从而产生我们需要的结果。

于 2009-03-02T14:44:15.980 回答
1

您是否拥有使用启动的代码CreateProcessWithLogonW(以及调用的代码CreateProcess)?如果你不这样做,那么你可能需要在它上面执行IAT(或 API)挂钩(即在运行时),以用也使用或CreateProcess的适当过程替换任何调用。请参阅APIHijackDetoursCreateProcessWithLogonWCreateProcessWithTokenW

完成此操作后,子进程可能需要访问HKCU. 如果您还没有这样做,您应该在调用之前加载每个模拟用户的配置文件,每个用户一次CreateProcessWithLogonW

默认情况下,CreateProcessWithLogonW 不会将指定的用户配置文件加载到 HKEY_USERS 注册表项中。这意味着访问 HKEY_CURRENT_USER 注册表项中的信息可能不会产生与正常交互式登录一致的结果。在调用 CreateProcessWithLogonW、使用 LOGON_WITH_PROFILE 或调用 LoadUserProfile 函数之前,您有责任将用户注册表配置单元加载到 HKEY_USERS 中。

于 2009-02-27T17:15:35.657 回答
0

服务是否没有允许它们与桌面交互的选项?如果可以为您的服务设置该选项,那可能是最简单的解决方案。

于 2009-02-27T15:35:24.463 回答
0

我假设这个过程是一项服务;问题中未指定,但鉴于它作为本地系统帐户运行,这似乎是合乎逻辑的。

你被卡住的地方不在CreateProcess,它在CreateService。如果您希望您的服务能够与桌面交互,则必须将SERVICE_INTERACTIVE_PROCESS参数指定为标志之一dwServiceType。此设置由服务的子进程继承。

您还可以使用服务工具修改现有服务的设置,选择服务的属性,单击“登录”选项卡,然后选中“允许服务与桌面交互”复选框。

于 2009-03-06T06:44:51.230 回答