Ir para conteúdo
Fórum Script Brasil
  • 0

Exitwindowsex


Paulo Nobre

Pergunta

Alguém saberia dizer por que, pelo menos no meu XP home a função da API ExitWindowsEx com o parâmetro 1 não funciona.

ExitWindowsEx (EWX_FORCE,0) funciona, mas aparecendo tela para fazer logon

ExitWindowsEx (1,0) que seria para desligar não funciona.

Alguém tem alguma idéia.

Uso isto num programa simples de alarme que funcionava normalmente no Win9x e Me.

Obrigado pela ajuda

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

s3c, tentei todas as combinações possíveis e a única coisa que consegui como já havia mencionado foi ao usar:

ExitWindowsEx(EWX_FORCE, 0);

fazer aparecer a tela de logon com o meu nome para eu bootar de novo.

Desligar mesmo não consigo nem a pau.

É muito estranho isto!!!

De qualquer forma muito obrigado.

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que tem a ver com os privilégios de shutdown do NT.

Tente modificá-los:

var
  TTkHandle       :THandle;
  TTkAtu,TTkAnt :TTokenPrivileges;
  TTkRet            :DWORD;
begin
  if OpenProcessToken(GetCurrentProcess(),
                      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
                      TTkHandle) then
    if LookupPrivilegeValue(nil,
                            'SeShutdownPrivilege',
                            TTkAtu.Privileges[0].Luid) then
    begin
      TTkAtu.PrivilegeCount           := 1;
      TTkAtu.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      Windows.AdjustTokenPrivileges(TTkHandle,
                                    False,
                                    TTkAtu,
                                    SizeOf(TTkAtu),
                                    TTkAnt,
                                    TTkRet);
      ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0);
    end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

São funções da Advapi32.dll na Windows.pas

Confesso que não me aprofundo muito nisso também, mas basicamente é o seguinte:

OpenProcessToken retorna o Handle da indicação de ajuste de privilégios para o seu processo.

LookupPrivilegeValue retorna em TTkAtu.Privileges[0].Luid o identificador p/ o privilégio de shutdown(SeShutdownPrivilege).

Com estas duas informações, você diz que o seu processo poderá desligar a máquina habilitando TTkAtu.Privileges[0].Attributes p/ enable e logo apos efetivar com AdjustTokenPrivileges.

Se o NT não reclamar em nenhum desses passos, então o shutdown funciona.

Se reclamar e você quiser saber o erro, então você deve utilizar GetLastError após cada uma delas.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...