Pergunta

Eu tenho um executável do Windows, que é lançado a partir de um serviço chamando CreateProcessWithLogonW () com um conjunto de detalhes do usuário specfied.

Isso funciona bem eo processo é iniciado como previsto. No entanto, quando esse processo tenta iniciar outros processos em si, atualmente apenas usando CreateProcess () Estes começam depois morrer imediatamente - eles são executáveis ??que requerem acesso de desktop

.

Depois de ler-se no artigo da Microsoft sobre CreateProcess () - http://msdn.microsoft.com/en-us/library/ms682425 (VS.85) .aspx

Eu acho que posso ver por que isso está acontecendo e faz sentido para uma extensão. CreateProcess () conhece o processo de chamada está representando um usuário para que ele usa-lo do processo pai, que neste caso é a conta do sistema local. Mas é claro que qualquer coisa corrida na conta do sistema local não tem o acesso precisamos, então as matrizes processo iniciado.

Curiosamente, quando eu estava usando anteriormente LogonUser () e CreateProcessAsUser () para iniciar o executável inicial dentro do serviço, ele funcionou bem. Mas eu tinha que mudar isso para CreateProcessWithLogonW () devido a problemas com não ter os privilégios corretos.

Alguém sabe de uma solução para isso? Eu vi falar sobre isso em outro lugar na web, mas não com qualquer solução definitiva. Parece que eu possivelmente precisar o token do utilizador estou logon com na CreateProcessWithLogonW () com que eu possa usá-lo para lançar os outros processos mais tarde? Mas eu não tenho nenhuma maneira de se apoderar desta forma, isso pode ser recuperada para o usuário atual de alguma forma?

Qualquer ajuda seria muito apreciada, obrigado:)

Foi útil?

Solução

Você possui o código lançado usando CreateProcessWithLogonW (e que por sua vez chamadas CreateProcess)? Se não, então você pode precisar executar IAT (ou API) enganchando sobre ele (ou seja, em tempo de execução), como para substituir todas as chamadas para CreateProcess com um procedimento adequado que também usa CreateProcessWithLogonW ou CreateProcessWithTokenW. Consulte APIHijack , Detours .

Depois que isso for feito, o processo filho pode exigir acesso a HKCU. Se você ainda não estiver fazendo isso, você deve carregar o perfil de cada usuário representado, uma vez por usuário, antes de chamar CreateProcessWithLogonW.

Por padrão, CreateProcessWithLogonW não carrega o usuário especificado perfil para o registo HKEY_USERS chave. Isto significa que o acesso a informações no HKEY_CURRENT_USER chave do Registro pode não produzir resultados que são consistentes com uma normais logon interativo. É o seu responsabilidade de carregar o usuário Registro hive em HKEY_USERS antes chamando CreateProcessWithLogonW, por usando LOGON_WITH_PROFILE, ou pela chamando a função LoadUserProfile.

Outras dicas

Nós resolvemos o problema usando algum código que eu encontrei há muito tempo. A seção de "copyright" de um dos módulos de fonte contém o seguinte:

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

Talvez esta informação irá produzir sucessos dentro de suas buscas do Google - Tentei algumas tentativas rápidas, mas veio de mãos vazias. Nós decomposto os internos em um conjunto de API que produziu os resultados que precisávamos.

Não há uma opção para os serviços que lhes permitam interagir com o ambiente de trabalho? Se definir essa opção para o seu serviço é uma possibilidade, que provavelmente seria a solução mais simples.

Estou assumindo que este processo é um serviço; que não está especificado na questão, mas parece lógico dado que está sendo executado como conta do sistema local.

Onde você está ficando preso não está na CreateProcess, está em CreateService . Se você quiser que o seu serviço a ser capaz de interagir com o ambiente de trabalho, você tem que especificar SERVICE_INTERACTIVE_PROCESS como uma das bandeiras para o dwServiceType argumento. Esta configuração é herdada por processos filho do serviço.

Você também pode modificar as configurações de um serviço já existente usando a ferramenta Serviços, selecione Propriedades para o serviço, clique na guia "Log On", e marque a caixa de seleção "Permitir serviço para interagir com área de trabalho".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top