CreateProcessWithLogonW()问题 – 需要用同一个用户启动subprocess

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

这工作正常,并按预期的过程开始。 然而,当这个进程试图启动其他进程本身,目前只是使用CreateProcess()这些开始,然后直接死掉 – 它们是需要桌面访问的可执行文件。

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

我想可以看出为什么会发生这种情况,这在某种程度上是有道理的。 CreateProcess()知道调用进程是模拟一个用户,所以它使用它的父进程,在本例中是本地系统帐户。 但是当然,在本地系统帐户中运行的任何东西都不具有我们需要的访问权限,所以启动的进程将会死亡。

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

有没有人知道这个解决scheme? 我已经看到在networking上的其他地方谈论这一点,但没有任何明确的解决办法。 看起来好像我可能需要在CreateProcessWithLogonW()中login的用户的标记,以便以后可以使用它来启动其他进程? 但是我没有办法获得这个令牌,可以以任何方式为当前用户提取吗?

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

你是否拥有使用CreateProcessWithLogonW (而又调用CreateProcess )启动的代码? 如果不这样做,则可能需要执行IAT(或API)挂接 (即在运行时),以便使用也使用CreateProcessWithLogonWCreateProcessWithTokenW的适当过程来替换对CreateProcess调用。 请参阅APIHijack , Detours 。

完成后,子进程可能需要访问HKCU 。 如果您尚未执行此操作,则应在调用CreateProcessWithLogonW之前,为每个用户加载每个模拟用户的配置文件。

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

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

 ///////////////////////////////////////////////////////////// // 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 // ///////////////////////////////////////////////////////////// 

也许这些信息会在你的Google搜索中产生冲击 – 我尝试了几次尝试,但空手而归。 我们把内部的东西分解成一组API来产生我们需要的结果。

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

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

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

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