Executando um arquivo de lote do PHP - detecção de serviços interativos? [fechadas]

2

Estou tendo muita dificuldade em executar um executável a partir de um script PHP (usando exec () ou vários outros comandos PHP que tentei).

O problema parece estar chegando a uma questão de permissões de usuário (possivelmente?) ou configuração de Windows / servidor, sobre a qual eu sei muito pouco.

Atualmente estou testando no host local do Windows, usando o WAMPserver. Eu tenho atualmente um arquivo .bat com o comando para executar o meu executável, assim como eu iria executá-lo a partir da linha de comando. Ao executar a partir da linha de comando, o .exe funciona bem; Da mesma forma, quando clico no arquivo .bat diretamente, ele inicia e executa o .exe como deveria. No entanto, quando tento executá-lo a partir do script PHP (atualmente usando exec('open.bat'); , embora eu tenha tentado várias outras maneiras de iniciá-lo), ele ativa algo chamado "Windows Interactive Services Detection".

Pelo que eu li, isso tem algo a ver com as "sessões" do Windows, por meio das quais os programas do usuário são executados na sessão 1 e os processos do sistema são executados na sessão 0, por questões de segurança. Mas por alguma razão, eu tenho permissão para executar o .bat bem se eu simplesmente clicar nele.

Então, talvez tenha a ver com o usuário em que o PHP está executando o arquivo em lote?

Eu tentei alguns métodos para executar o arquivo como um usuário diferente, como o uso de CPAU , que permite que um programa seja executado sob um usuário diferente. Novamente, ao clicar no arquivo batch diretamente, o programa funcionou bem, mas ao ativá-lo a partir do PHP, não funcionou (ao usar o CPAU, ao invés de Interactive Services Detection aparecer, ele simplesmente não fazia nada).

Alguém encontrou um problema semelhante ao tentar executar um executável a partir do PHP, ou ter uma ideia de como posso executá-lo?

    
por Nik 29.12.2012 / 02:27

1 resposta

2

Todos os processos do modo de usuário no Windows são executados como "um usuário", mesmo que esse "usuário" seja "Sistema local". Portanto, todos os serviços do Windows são executados como "um usuário". IIS ou Apache, o que quer que você esteja usando, é executado como usuário.

Esse usuário não é você.

Mesmo que você tenha executado o servidor da Web (o serviço do Windows) na sua conta de usuário, uma nova sessão de logon que não seja "sua" sessão de logon ainda será criada porque o sistema está fazendo logon em outra instância da sua conta de usuário. Contas de usuário e sessões de logon são coisas diferentes. Cada sessão de logon interativo tem uma área de trabalho separada, portanto, qualquer coisa que o serviço envolvesse mostrando coisas em sua área de trabalho aconteceria em sua área de trabalho, e não na sua.

O arquivo em lote e o executável funcionam como deveriam quando você clica neles porque eles são iniciados na sua sessão. Quando o Windows detecta que um programa em execução como um serviço está tentando interagir com uma área de trabalho, a Detecção de Serviço Interativo é acionada (que é executada como um serviço do Windows.) O raciocínio é que os serviços do Windows não devem ser totalmente interativos e não têm GUI requer entrada de um humano. Caso contrário, você provavelmente está lidando com um executável que não foi bem projetado para ser um serviço do Windows. Mesmo assim, você deve ser capaz de clicar em "Exibir a Mensagem" ou qualquer que seja o prompt da Detecção de Serviços Interativos e levará você temporariamente para a área de trabalho da Sessão 0 para interagir com a GUI "serviço", mas também interromperá sua área de trabalho enquanto você está na área de trabalho da Sessão 0. (Ele cria um novo processo em sua sessão para informá-lo de que algo na sessão 0 quer sua atenção.)

Tudo bem, então o que você realmente pode fazer sobre isso? Bem, você realmente não deu nenhum detalhe sobre o que este executável que você está executando como um serviço do Windows é ou o que ele faz, mas parece que você quer que ele seja executado em sua sessão, em seu desktop, para que você possa interagir com ele como faria com o Solitaire.exe.

Bem, lançar coisas em sessões de outros usuários não é uma ação rotineira no Windows, mas o psexec deve ser capaz de fazê-lo.

psexec.exe \computername -i 1 program.exe

No exemplo acima, o número 1 especifica em qual sessão o programa.exe será executado. Se você quiser disparar manualmente a Detecção de serviços interativos, use a sessão 0.

Para ler mais: link

    
por 29.12.2012 / 04:20