我有一个从服务中通过与一组用户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)钩 在其上(即,在运行时),作为替代的任何呼叫与也使用CreateProcessCreateProcessWithLogonW适当的程序来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之一。这种设置由服务的子进程继承。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top