Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 1703 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Boa noite,

Ao tentar instalar o ACBr utilizando o instalador (ACBrInstall_Trunk2) em um Windows Server 2012 R2 (estando conectado através de remote desktop) dá um erro no fim da instalação dizendo que o diretório de sistema não foi encontrado. Depois de fazer algumas buscas na internet entendi o porquê:

"With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory."

E é o que acontece aqui comigo, ao invés de retornar "C:\Windows" a função GetWindowsDirectory retorna "C:\Users\<usuario>\WINDOWS".

A solução é bem simples e consiste em setar uma flag no arquivo DPR do projeto.

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

Estou encaminhando em anexo o arquivo corrigido para que o repositório possa ser atualizado.

E peço desculpas se estou postando no local errado, não encontrei nada específico para o instalador.

ACBrInstall_Trunk2.dpr

  • Curtir 2
  • Consultores
Postado
16 horas atrás, Ronaldo Negreiros Daniel disse:

E é o que acontece aqui comigo, ao invés de retornar "C:\Windows" a função GetWindowsDirectory retorna "C:\Users\<usuario>\WINDOWS".

A solução é bem simples e consiste em setar uma flag no arquivo DPR do projeto.

{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}

Estou encaminhando em anexo o arquivo corrigido para que o repositório possa ser atualizado.

E peço desculpas se estou postando no local errado, não encontrei nada específico para o instalador.

Olá Ronaldo,

   Acho que precisamos verificar essa situação com mais cautela. De acordo com a documentação da Microsoft, o ACBrInstall não parece ser compatível com essa flag.

   Vejas as exigências na documentação:

Citar

If your application meets the following criteria, you can safely use the IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE flag.

  • The application does not use .ini files.
  • The application does not write to HKEY_CURRENT_USER during setup. For more information, see Storing User-Specific Information.
  • The application does not run as a system service (that is, LUID=System).
  • The application does not expect exclusive access to the Windows or other system directories. This means that the application does not store per user temporary or configuration data in the Windows or other system directories.
  • The application does not write to the HKEY Local Machine registry hive for user specific data or configuration.
  • The application follows other Remote Desktop Services compatibility guidelines mentioned in this document.

O primeiro ponto (não usar arquivos .ini) já é suficiente para que o ACBrInstall não se enquadre nas aplicações que podem usar de forma segura o flag mencionado.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
Postado

Boa tarde Elton,

Sim eu vi esse detalhe e no entanto mesmo assim a aplicação funcionou corretamente lendo/gravando o arquivo INI e recuperando corretamente o local da pasta Windows.

Uma outra alternativa seria modernizar a chamada da API pois GetWindowsDirectory/SHGetFolderPath não funcionarão nesse caso.

O que pode-se tentar fazer somente nesse caso (pois há como detectar se o aplicativo está sendo executado em ambiente de terminal) seria ler a variável de ambiente WINDIR.

Vou enviar uma outra versão com o código alterado para que possam verificar se a solução é melhor.

  • Membros Pro
Postado (editado)

Boa tarde,

Segue em anexo outras 2 possíveis soluções para o problema e nesse caso a unit alterada é a ACBrInstallUtils.pas

Em ambos os arquivos a função alterada foi a "PathSystem".

Em anexo está:

ACBrInstallUtils.Solucao1.pas - Nesse arquivo foi alterado a chamada da API GetWindowsDirectory para a GetSystemWindowsDirectory que conforme documentação da Microsoft retorna a pasta correta em ambos os casos (sistema single-user ou multi-user):

"With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory."

Fonte: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemwindowsdirectoryw

ACBrInstallUtils.Solucao2.pas - Nesse arquivo foi incluída uma nova função chamada IsRemoteSession que retorna se a aplicação está rodando em uma sessão de terminal server e caso afirmativo a pasta Windows é retornada através da variável de Ambiente "WINDIR".

Acredito que essas alterações são melhores do que a postada anteriormente.

 

ACBrInstallUtils.Solucao1.pas ACBrInstallUtils.Solucao2.pas

Editado por Ronaldo Negreiros Daniel
  • Curtir 2
  • 2 semanas depois ...
  • Consultores
  • Solution
Postado
Em 16/03/2020 at 14:20, Ronaldo Negreiros Daniel disse:

Boa tarde,

Segue em anexo outras 2 possíveis soluções para o problema e nesse caso a unit alterada é a ACBrInstallUtils.pas

Em ambos os arquivos a função alterada foi a "PathSystem".

Em anexo está:

ACBrInstallUtils.Solucao1.pas - Nesse arquivo foi alterado a chamada da API GetWindowsDirectory para a GetSystemWindowsDirectory que conforme documentação da Microsoft retorna a pasta correta em ambos os casos (sistema single-user ou multi-user):

"With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory."

Fonte: https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemwindowsdirectoryw

ACBrInstallUtils.Solucao2.pas - Nesse arquivo foi incluída uma nova função chamada IsRemoteSession que retorna se a aplicação está rodando em uma sessão de terminal server e caso afirmativo a pasta Windows é retornada através da variável de Ambiente "WINDIR".

Acredito que essas alterações são melhores do que a postada anteriormente.

 

ACBrInstallUtils.Solucao1.pas 10 kB · 1 download ACBrInstallUtils.Solucao2.pas 10 kB · 1 download

Muito obrigado pela contribuição.
Fiz a implementação baseada na "Solucao1".
Subi as alterações para o SVN na Revisão  19527.
Pelo que vi está tudo certo.
Queira por favor atualizar, testar e reportar qualquer problema.

Mais uma vez obrigado.

  • Obrigado 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Administradores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 1703 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.