CreateProcessWithLogonW()的问题 - 需要启动子进程具有相同的用户
-
09-09-2019 - |
题
我有一个从服务中通过与一组用户specfied细节调用CreateProcessWithLogonW()推出了Windows可执行文件。
此工作正常,处理开始按预期方式。但是,当这个过程中尝试推出其他进程本身,目前只是用的CreateProcess(),那么这些创业死马上 - 他们需要桌面访问可执行文件
上的CreateProcess()对微软的文章读了之后 - 的 http://msdn.microsoft.com/en-us/library/ms682425(VS.85)的.aspx
我觉得可以看到为什么发生这种情况是有意义的程度。的CreateProcess()知道调用进程正在模拟用户,因此使用它的父进程,在这种情况下是本地系统账户。但当然,任何在本地系统帐户下运行没有我们需要的访问权限,因此启动的过程中死亡。
奇怪,当我以前使用的LogonUser()和CreateProcessAsUser()来启动服务内的初始可执行文件,它工作得很好。但我不得不改变这CreateProcessWithLogonW()由于与不具有正确的特权的问题。
有谁知道一个解决的办法吗?我已经看到了有关在网络上,但不与任何明确的解决了这个别处谈话。好像我可能需要我在快乐CreateProcessWithLogonW()与这样我就可以用它晚些时候推出其他进程登录与用户的令牌?但我没有得到这个令牌持有的方式,可以这样retreived以任何方式当前用户?
任何帮助将不胜感激,感谢:)
解决方案
您是否拥有使用CreateProcessWithLogonW
推出的代码(这反过来又要求CreateProcess
)?如果你没有,那么你可能需要执行 IAT(或API)钩 强>在其上(即,在运行时),作为替代的任何呼叫与也使用CreateProcess
或CreateProcessWithLogonW
适当的程序来CreateProcessWithTokenW
。请参见 APIHijack ,绕行。
完成此操作后,子进程可能需要访问HKCU
。如果你是不是已经这样做了,你应该加载每个模拟用户的配置文件,每个用户一次,要求CreateProcessWithLogonW
之前。
默认情况下,CreateProcessWithLogonW 不加载指定的用户 简介进入注册表HKEY_USERS 键。这意味着,访问 在HKEY_CURRENT_USER信息 注册表项可能不会产生结果 这是一个正常的一致 交互式登录。这是你的 责任加载用户 注册表配置单元为前HKEY_USERS 呼吁CreateProcessWithLogonW,由 使用LOGON_WITH_PROFILE,或通过 调用LoadUserProfile函数。
其他提示
我们使用一些代码,我发现很久以前的解决了这个问题。源模块中的一个的“版权”部分包含以下:
/////////////////////////////////////////////////////////////
// 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,它得到我们需要的结果。
是不是有一个选项,服务,使他们能够与桌面交互?如果设置为您服务该选项是可能的,这将可能是最简单的解决方案。
我假定这个过程是一个服务;未在规定的问题,但由于它被作为本地系统运行帐户似乎是合乎逻辑。
如果你陷入不CreateProcess
,它在的 CreateService
。如果你希望你的服务能够与桌面交互,你必须指定的 SERVICE_INTERACTIVE_PROCESS
作为标志的说法dwServiceType
之一。这种设置由服务的子进程继承。
您还可以通过使用服务工具,为服务选择属性修改现有服务的设置,点击“登录”选项卡,并选中复选框“允许服务与桌面交互”。