Sessão interativa 0 no Windows 7

14

Estou tentando iniciar o cmd.exe na sessão 0. Até agora, fiz o seguinte em um prompt de comando elevado:

sc config UI0Detect start= auto
net start UI0Detect

E a resposta indica que o serviço foi iniciado corretamente. Nesse ponto, presumi que, se eu alternasse para a sessão 0, o cmd.exe estaria em execução.

Alterno para a sessão 0 usando o seguinte comando:

rundll32 winsta.dll,WinStationSwitchToServicesSession

Isso muda com êxito para a sessão 0, mas a única janela disponível é a que tem a opção de retornar à sessão 1.

Como faço para iniciar o cmd.exe na sessão 0?

omghai2u
fonte
Por que você quer fazer isso? O UI0Detect permite que serviços antigos exibam uma caixa de mensagem, não iniciando novos aplicativos GUI. cmd.exe tem uma interface gráfica
Peter Hahndorf
6
@PeterHahndorf Entendo que é divertido desviar a resposta das perguntas dizendo "vamos dar um passo para trás e ver se é isso que realmente precisamos fazer, porque isso soa como uma má idéia", e é uma maneira relativamente agradável de condescender com outros desenvolvedores. Mas como esse é um cenário de depuração e pretende ser uma solução rápida (e alternativa ao uso de aplicativos de terceiros como o AlwaysUp), não vejo como perguntar "por que" é uma resposta útil. Obrigado mesmo assim.
Omghai2u
Eu acho que Peter tem razão. A pergunta que você deveria ter escrito é "É isso que estou tentando fazer". Uma solução rápida envolverá apenas dor futura. Não sei contar quantas vezes ouvi "correção rápida" apenas para ver a "correção rápida" em produção três anos depois. . . precisando de outra "solução rápida". Suponho que você esteja digitando para executar algum tipo de script em lote?
Surfasb
1
@surfasb A pergunta que você sugeriu é essencialmente a pergunta que escrevi: "Estou tentando iniciar o cmd.exe na sessão 0." Por favor, mantenha as respostas focadas nessa pergunta. Obrigado. E não há chance de que isso chegue à produção ou envolva dor futura. O modo como faço para produção já está definido, mas não posso usá-lo para depuração. Atualmente, a maneira como faço isso para depuração é complicada e envolve o uso de um aplicativo de terceiros.
Omghai2u

Respostas:

19

Para iniciar o cmd.exe na sessão 0, use o psexec do Sysinternals

psexec.exe -s 0 cmd.exe

Agora você tem um console em execução na sessão 0,

você também pode iniciar o cmd.exe na sessão 0 e exibir a GUI:

psexec.exe -s -i 0 cmd.exe

Dessa forma, quando você alterna para a sessão 0, o cmd.exe estará esperando por você lá.

você tem tantos direitos quanto pode obter no Windows 7:

whoami /all

se você usa outros PsTools, lembre-se de usar a opção / accepteula:

pslist /accepteula

caso contrário, o programa exibirá uma caixa de mensagem para solicitar a aceitação do Eula, o programa será interrompido porque não há interface do usuário na sessão 0 para fechar a caixa de mensagem.

Para verificar se você está executando na sessão 0, você pode usar qprocess:

qprocess /ID:0

você verá seu 'cmd.exe' entre todos os processos de serviço.

Peter Hahndorf
fonte
Agradecimentos impressionantes por tentar responder à minha pergunta. Isso certamente funcionaria, minha intenção específica (conforme apontado nos comentários), no entanto, era evitar o uso de aplicativos de terceiros. Existe uma boa maneira de fazer isso que não exija o uso de ferramentas SysInternals (ou realmente qualquer coisa que não esteja disponível no Windows)? Obrigado novamente.
Omghai2u
2
Não considero as ferramentas Sysinternal 'de terceiros', elas são da Microsoft e você não precisa instalá-las.
Peter Hahndorf
Desculpe, eu estava considerando qualquer coisa não instalada por padrão "de terceiros".
Omghai2u 27/05
Pedro. Perfeito, obrigado. Funciona perfeitamente para iniciar um processo na sessão 0 (o que significa que continua a funcionar quando terminar a sessão.)
Daniel James Bryars
5
A primeira linha de comando está errada: -sroda como SYSTEMusuário e não aceita argumentos. Talvez você quis dizer -i 0no primeiro exemplo e -s -i 0no segundo?
GTC
1

Isso não vai funcionar. Apenas inicia um processo como sistema.

Serviços são programas escritos de uma maneira especial para aceitar comandos do gerenciador de controle de serviço.

A Microsoft possui um utilitário que permite executar um programa como serviço. É chamado Srvanye está nas Ferramentas do Windows 2003 Resource Kit.

Faça o download das ferramentas do Windows Server 2003 Resource Kit

David
fonte
0

Descobri a solução por acidente um dia, mas http://www.alex-ionescu.com/?p=59 também documenta uma solução próxima ao que encontrei

Crie um arquivo em lotes com o seguinte (chame de some.bat)

start cmd

Em seguida, crie um serviço para chamar esse arquivo em lotes (usando um prompt de comando do administrador)

sc create access0 type= interact type= own binpath= some.bat

(Observe o espaço após cada = e sugiro usar o caminho completo para some.bat)

Então é uma questão de iniciar os serviços

sc start ui0detect
sc start access0

(Não há necessidade de fazer o ui0detect iniciar automaticamente com a configuração sc UI0Detect start = auto)

E se tudo correr bem, você receberá a caixa intermitente de mensagens iminentes! Vá para Visualizar mensagens e você terá um prompt de comando Admininstrator (nt Authority \ system) que não será destruído automaticamente por uma falha no início do serviço (daí a necessidade de um arquivo em lotes com o comando start)

Isso funciona, embora às vezes não funcione na primeira tentativa.

Eu acredito que isso lhe dá acesso apenas à sessão interativa 0, que existe apenas para o usuário nt Authority \ system

Andy
fonte
-2

Você pode usar o atalho start (Windows) + R para iniciar a caixa de diálogo 'run'. A partir daí, basta digitar 'cmd' (sem aspas) e voila. cmd

Y2Forever
fonte
3
Bem-vindo ao SuperUser. Sua postagem não responde à pergunta dos OPs. Iniciar CMDnormalmente não o coloca Session 0.
Eu digo Restabelecer Monica