Processo Iniciado usando "CreateProcessAsUser" se comporta de forma diferente do que interactive lançou o processo de

Quando lançado através de CreateProcessAsUser api o controle webbrowser incorporado dentro do aplicativo lançado lança um erro "O arquivo não pôde ser escrita para o cache" quando o direito do mouse e selecionando "salvar destino como" em determinados links dentro de controlo do browser.

CreateProcessAsUser chamada está sendo feita a partir de dentro de um serviço, como parte de OnStart() função. Ele recupera o identificador para a sessão atual do usuário, enumerando todas as sessões e de verificar o estado para "WTS_CONNECTSTATE_CLASS.WTSActive"

Lançamento exatamente a mesma executável através de duplo clique em eu sou capaz de baixar os arquivos sem problema.

Verifiquei que o lançou processo é executado sob a mesma conta de usuário através do gestor de tarefas detalhes, bem como através do Sistema.Segurança.Principal.WindowsIdentity.GetCurrent().O nome.

Eu tentei executar o serviço utilizando o início de sessão interactivo conta; isso evita que o serviço está sendo capaz de lançar qualquer executável usando a função CreateProcessAsUser. Processos iniciados usando o Sistema.O diagnóstico.Do processo.Start() estão na sessão 0 e escondido do ambiente de trabalho interactivo e não consegue acessar os recursos de rede.

Eu também tentei utilizar o Sistema.O diagnóstico.Processo com credenciais de utilizador transmitida através de StartInfo, no entanto, eu recebo a mensagem "Acesso Negado" ao chamar Start().

 if (WTSEnumerateSessions(
                (IntPtr)WTS_CURRENT_SERVER_HANDLE,  // Current RD Session Host Server handle would be zero.
                0,                                  // This reserved parameter must be zero.
                1,                                  // The version of the enumeration request must be 1.
                ref ppSessionInfo,                  // This would point to an array of session info.
                ref SessionCount                    // This would indicate the length of the above array.
                ))
            {
                for (int nCount = 0; nCount < SessionCount; nCount++)
                {
                    // Extract each session info and check if it is the 
                    // "Active Session" of the current logged-on user.
                    WTS_SESSION_INFO tSessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure(
                        ppSessionInfo + nCount * Marshal.SizeOf(typeof(WTS_SESSION_INFO)),
                        typeof(WTS_SESSION_INFO)
                        );

                    if (WTS_CONNECTSTATE_CLASS.WTSActive == tSessionInfo.State)
                    {
                        IntPtr hToken = IntPtr.Zero;
                        if (WTSQueryUserToken(tSessionInfo.SessionID, out hToken))
                        {
                            // Launch the child process interactively 
                            // with the token of the logged-on user.
                            PROCESS_INFORMATION tProcessInfo;
                            STARTUPINFO tStartUpInfo = new STARTUPINFO();
                            tStartUpInfo.cb = Marshal.SizeOf(typeof(STARTUPINFO));

                            bool ChildProcStarted = CreateProcessAsUser(
                                hToken,             // Token of the logged-on user.
                                ChildProcName,      // Name of the process to be started.
                                Args,               // Any command line arguments to be passed.
                                IntPtr.Zero,        // Default Process' attributes.
                                IntPtr.Zero,        // Default Thread's attributes.
                                false,              // Does NOT inherit parent's handles.
                                0,                  // No any specific creation flag.
                                null,               // Default environment path.
                                workingDirectory,   // Default current directory.
                                ref tStartUpInfo,   // Process Startup Info. 
                                out tProcessInfo    // Process information to be returned.
                                );

Espero que o comportamento do programa iniciado usando o código acima para ser o mesmo como se fosse iniciado de forma interativa a partir da sessão da área de trabalho - e para além do controlo webbrowser e urlmon comportamentos parece ser idêntica.

0
2019-09-19 08:11:13
origem
0 respostas

Veja mais perguntas por marcas