Como identificar, pelo OpStatus do LoginUser, que o usuário precisa definir uma nova senha — e conduzir a troca em uma tela de login própria.
Introdução
Para obrigar um usuário a definir a própria senha no primeiro acesso, o Elipse E3 oferece a propriedade Forçar troca de senha, na aba Propriedades de Segurança do usuário. Em telas de login próprias — que usam LoginUser no lugar da janela padrão — cabe ao script detectar essa exigência e conduzir a troca.
1. Habilitando a propriedade
- No E3 Studio, acesse o menu Arquivo e escolha Usuários.
- Selecione o item Usuários e dê um duplo clique no usuário desejado.
- Abra a aba Propriedades de Segurança.
- Altere a opção Forçar troca de senha para Verdadeiro.
- Confirme em OK e clique em Aplicar.
A propriedade vale apenas para usuários do DomĂnio do Elipse E3 — contas com autenticação do Windows sĂŁo gerenciadas pelo domĂnio de rede.
Aba Propriedades de Segurança do usuário no E3 Studio, com a opção “Forçar troca de senha” em Verdadeiro.2. Detectando a exigência no login
LoginUser(Username, UserPassword, [OpStatus], [WarnDaysToExpire]) retorna um valor booleano e nĂŁo exibe nenhuma mensagem. OpStatus Ă© um parâmetro de saĂda — basta declarar uma variável e passá-la na chamada. Considere o login efetivo somente quando o retorno for True e o OpStatus for 0.
Com a propriedade habilitada, o OpStatus vem 4 (a senha atual deve ser trocada). Outros valores frequentes: 2 credenciais inválidas, 8 senha expirada, 16 conta bloqueada e 32 conta desabilitada. A lista completa está na documentação do LoginUser.
3. Script da tela de login
A tela tem trĂŞs objetos: spUsuario e spSenha para as credenciais e spNovaSenha, inicialmente invisĂvel, para a nova senha — Ă© a visibilidade desse campo que define a etapa. O cĂłdigo vai no evento Click do botĂŁo de confirmação (cole apenas o corpo; o E3 já fornece a linha de declaração do evento):
Dim ok, st If Screen.Item("spNovaSenha").Visible = False Then ' --- Etapa 1: autenticacao --- ok = Application.LoginUser(Screen.Item("spUsuario").Value, _ Screen.Item("spSenha").Value, st) If ok And st = 0 Then Exit Sub ' login concluido If st = 4 Or st = 8 Then ' troca obrigatoria ou senha expirada MsgBox "A senha deste usuario deve ser alterada.", vbExclamation Screen.Item("spNovaSenha").Value = "" Screen.Item("spNovaSenha").Visible = True Else MsgBox "Falha no login (status " & st & ").", vbCritical End If Else ' --- Etapa 2: troca da senha --- ok = Application.ChangeUserPassword(Screen.Item("spUsuario").Value, _ Screen.Item("spSenha").Value, _ Screen.Item("spNovaSenha").Value, st) If ok And st = 0 Then Screen.Item("spNovaSenha").Visible = False Screen.Item("spSenha").Value = "" Screen.Item("spNovaSenha").Value = "" MsgBox "Senha alterada com sucesso. Faca login novamente.", vbInformation Else MsgBox "A nova senha foi recusada pela politica do Dominio " & _ "(status " & st & ").", vbCritical End If End If
ChangeUserPassword(Username, PasswordOld, PasswordNew, [OpStatus]) recebe a senha atual explicitamente, entĂŁo funciona sem uma sessĂŁo autenticada — a situação de quem foi barrado pela troca obrigatĂłria. Teste sempre o retorno: se a nova senha violar a polĂtica do DomĂnio o mĂ©todo falha, e sem essa verificação o script anuncia um sucesso que nĂŁo houve. O motivo da recusa vem no OpStatus, em cĂłdigos a partir de 0x001000.
4. Observações
- A troca desconecta as demais sessões, exceto aquela onde ela foi executada.
- “Não permitir mudança de senha”, na mesma aba, torna a alteração exclusiva do administrador: a troca em tempo de execução retorna
0x002000. Combinada com Forçar troca de senha, deixa o usuário sem saĂda. - “Permitir mudar senha expirada” precisa estar habilitada para que o fluxo atenda tambĂ©m o
OpStatus = 8. - Limpe os campos depois de usar — senha em texto claro na propriedade
Valuede um Setpoint fica acessĂvel a qualquer associação ou consulta de propriedade.
